动态添加case语句sql server

时间:2018-04-12 06:53:57

标签: sql-server

我是sql server的新手,有如下的要求,

需要使用case when when语句从db中选择记录列表。例如;

select * from test where test.id in (case when @id = '' then test.id else @id end);

这里@id将是这样的逗号分隔值(123,124,125,126)。

如果我只传递一个值,即。 @id = 123.它正常工作,并在传递元素数组时失败。任何人都可以建议一些解决方案。

2 个答案:

答案 0 :(得分:0)

尝试以下方法。

select * from test where @id = '' OR ',' + @id LIKE '%,' + test.id + '%'

答案 1 :(得分:0)

  1. 您可以为分割字符串创建函数xml

     CREATE FUNCTION [dbo].StringSplitXML
     (
            @String  VARCHAR(MAX), @Separator CHAR(1)
     )
     RETURNS @RESULT TABLE(Value VARCHAR(MAX))
       AS
        BEGIN
    DECLARE @XML XML SET @XML = CAST( ('' + REPLACE(@String, @Separator, '') + '') AS XML)

     INSERT INTO @RESULT
     SELECT t.i.value('.', 'VARCHAR(MAX)') 
     FROM @XML.nodes('i') AS t(i)
     WHERE t.i.value('.', 'VARCHAR(MAX)') <> ''
    
     RETURN
    END
    

  2. 创建功能后,您可以更改脚本

  3. declare @querystring varchar(2000) declare @id varchar(200) set @querystring ='select * from test where id ' + ( case when @id = '' then 'in (id)' else ' in (select value from StringSplitXML('''+@id+''','',''))' end ) EXECUTE( @querystring)