Игнорировать данные из входного массива потоковой аналитики, содержащего определенное значение - PullRequest
0 голосов
/ 10 января 2019

Используя данные этого примера:

{
"device":"TestDevice",
"id":30,
"flags":[ "New", "Ignore"]
}

Я хочу выбрать все данные без флага «Игнорировать», у меня все работает с udf:

SELECT 
 device, id, flags
 FROM input
 WHERE udf.ArrayContains(flags, "Ignore) = 0

Возможно ли это сделать без пользовательской функции?

1 Ответ

0 голосов
/ 14 января 2019

Это сделает свое дело

with cte as 
(
    select
        i.*        
    from
        localInput as i
    outer APPLY
        getarrayelements(i.flags) ae
    where   
        ae.ArrayValue != 'Ignore'    
    or 
        getarraylength(i.flags) = 0
)
select
    c.id,    
    c.device,
    c.flags
from    
    cte c
group by  
    c.id,    
    c.device,
    c.flags,
    System.Timestamp
having
    count(*) = getarraylength(c.flags) 
or 
    getarraylength(c.flags) = 0

Я проверил это на следующих данных:

{"device":"TestDevice1","id":1,"flags":[ "New", "Ignore"]}
{"device":"TestDevice2","id":2,"flags":[ "New"]}
{"device":"TestDevice3","id":3,"flags":[ "Ignore"]}
{"device":"TestDevice2","id":4,"flags":[ "Something", "Else"]}
{"device":"TestDevice2","id":5,"flags":[]}
...