Использование предложения IN с List agg. функция - PullRequest
0 голосов
/ 30 января 2020

есть ли способ использовать предложение "IN" с агрегатной функцией "Список", как в этом примере:

SELECT 
  FirstName,
  LastName,
  CASE 
    WHEN 1 IN LIST(ID) THEN 'Admin'
    WHEN 2 IN LIST(ID) THEN 'Moderator'
    WHEN 3 IN LIST(ID) THEN 'Owner'
  ELSE
    String(FirstName, ' ', LastName)
  END as Description
FROM Users
Group By FirstName, LastName;

, и если нет, то какой обходной путь для этого?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Единственное решение, которое я нашел, - это снова разделить список, используя sa_split_list , например:

SELECT 
  FirstName,
  LastName,
  LIST(ID) as lst,
  CASE 
    WHEN 1 IN (SELECT row_value from sa_split_list(lst)) THEN 'Admin'
    WHEN 2 IN (SELECT row_value from sa_split_list(lst)) THEN 'Moderator'
    WHEN 3 IN (SELECT row_value from sa_split_list(lst)) THEN 'Owner'
  ELSE
    String(FirstName, ' ', LastName)
  END as Description
FROM Users
Group By FirstName, LastName;

или

SELECT 
  FirstName,
  LastName,
  LIST(ID) as lst,
  CASE 
    WHEN Exists(SELECT 1 from sa_split_list(lst) where row_value = 1) THEN 'Admin'
    WHEN Exists(SELECT 1 from sa_split_list(lst) where row_value = 2) THEN 'Moderator'
    WHEN Exists(SELECT 1 from sa_split_list(lst) where row_value = 3) THEN 'Owner'
  ELSE
    String(FirstName, ' ', LastName)
  END as Description
FROM Users
Group By FirstName, LastName;

, и это сделало работу, я все еще думаю, что производительность будет большой для больших запросов ...

0 голосов
/ 31 января 2020

Если я намеренно прервал ваш запрос, это должно net получить желаемый результат:

SELECT
  FirstName,
  LastName,
  CASE MIN(ID)
    WHEN 1 THEN 'Admin'
    WHEN 2 THEN 'Moderator'
    WHEN 3 THEN 'Owner'
  ELSE
    String(FirstName, ' ', LastName)
  END as Description
FROM Users
Group By FirstName, LastName;

Альтернативный, но не очень обходной путь может быть CASE WHEN ','+LIST(ID)+',' LIKE '%,1,%' THEN ...

...