我是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.它正常工作,并在传递元素数组时失败。任何人都可以建议一些解决方案。
答案 0 :(得分:0)
尝试以下方法。
select * from test where @id = '' OR ',' + @id LIKE '%,' + test.id + '%'
答案 1 :(得分:0)
您可以为分割字符串创建函数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
创建功能后,您可以更改脚本
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)