SQL: мне нужно вернуть всю запись, когда в параметре обнаружено 'showall', но когда он не найден, необходимо выполнить фильтрацию по этому параметру - PullRequest
0 голосов
/ 16 июня 2020
@Network = 'showall,A,B,C' or @Network = 'A,B,C'

Когда присутствует 'showall', мне нужно показать все записи, но если они не найдены, мне нужно отфильтровать записи по списку.

WHERE rolename  in ('A','B','C')

Я смог сделать последняя часть как таковая

SET @Network = '''' + replace(@Network, ',',''',''') + '''';
where rolename in (@Network);`

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

IN не работает, WHERE rolename IN ('A,B,C') будет эквивалентно WHERE rolename = 'A,B,C'. IN принимает список скалярных значений (например, 'A','B','C'), а не скалярное значение с разделителями (например, 'A,B,C').

Предполагая, что вы используете современную версию SQL Server, тогда вам нужно будет использовать STRING_SPLIT для работы со скалярным значением с разделителями L

WHERE rolename IN (SELECT value FROM STRING_SPLIT(@Network,','))

Если, однако, вы хотите передать параметр «показать все», тогда обычно вам лучше передать NULL:

WHERE (rolename IN (SELECT value FROM STRING_SPLIT(@Network,','))
   OR  @Network IS NULL)

Если вы должны передать 'showall', сделайте это значение @Network, а не 'showall,A,B,C', а затем просто замените @Network IS NULL на @Network = 'showall'

Обратите внимание, что с такими запросами вы, вероятно, столкнетесь с плохим кэшированием плана запроса. Если запрос будет таким же простым, как приведенные выше предложения WHERE, то простое добавление OPTION (RECOMPILE) позволит обойти это; поскольку он заставляет механизм данных каждый раз воссоздавать план запроса. Однако, если ваш запрос более сложный, тогда вам будет лучше пойти по маршруту запроса Dynami c и включить предложение rolename IN (SELECT value FROM STRING_SPLIT(@Network,',') только при необходимости.

0 голосов
/ 16 июня 2020

Вы можете использовать:

where @network in (select s.value from string_split(@network, ',') s) or
      concat(',', @network, ',') like '%,showall%,'
...