sql:当在参数中找到“showall”时,我需要返回所有记录,但如果找不到,则需要从该参数中进行筛选

nbnkbykc  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(625)
@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);`
4sup72z8

4sup72z81#

您可以使用:

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

aurhwmvo2#

IN 不是那样工作的, WHERE rolename IN ('A,B,C') 相当于 WHERE rolename = 'A,B,C' . IN 获取标量值列表(例如。 'A','B','C' ),而不是分隔的标量值(例如。 'A,B,C' ).
假设您使用的是sql server的现代版本,那么您需要使用 STRING_SPLIT 使用分隔标量值的步骤

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

但是,如果您想传递一个“show all”参数,那么通常您最好传递它 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) 会绕过这个;因为它每次都强制数据引擎重新创建查询计划。但是,如果您认为查询更复杂,那么实际上最好采用动态查询路线,只包含 rolename IN (SELECT value FROM STRING_SPLIT(@Network,',') 必要时提供条款。

相关问题