Sql CASE语句不适用于“IN”
下面的SQL查询返回结果Sql CASE语句不适用于“IN”,sql,sql-server,Sql,Sql Server,下面的SQL查询返回结果 declare @flag bit = 0 select * from file_table fd where fd.person_id = case @flag when 0 then 10349196 else fd.person_id end 但是我想将上面的查询更改为包含两个person_id,如下所示 decl
declare @flag bit = 0
select *
from file_table fd
where fd.person_id = case @flag
when 0 then 10349196
else fd.person_id
end
但是我想将上面的查询更改为包含两个person_id,如下所示
declare @flag bit = 0
declare @person_ids varchar(100) = '(1001,1002)'
select *
from file_table fd
where fd.person_id in case @flag
when 0 then @person_ids
else fd.person_id
end
但是这个查询抛出了错误
关键字“case”附近的语法不正确
有人能帮我解决这个问题吗?我的目的是在case语句中包含第二个查询中所示的两个人ID。您可以使用或,如下所示:
declare @flag bit = 0
declare @person_ids varchar(100) = '(1001,1002)'
select *
from file_table fd
where fd.person_id in (select
case @flag when 0 then @person_ids
else fd.person_id
end)
declare @flag bit = 0
declare @person_ids varchar(100) = ',1001,1002,' -- You need ',' at beginning and end
select *
from file_table fd
where
@flag != 0 OR
@person_ids LIKE '%,' + fd.person_id + ',%' -- Type of fd.person_id must be varchar.
-- If not Convert to varchar.
您可以使用或,如下所示:
declare @flag bit = 0
declare @person_ids varchar(100) = ',1001,1002,' -- You need ',' at beginning and end
select *
from file_table fd
where
@flag != 0 OR
@person_ids LIKE '%,' + fd.person_id + ',%' -- Type of fd.person_id must be varchar.
-- If not Convert to varchar.
如果person\u id列包含整数值,则您的case语句将不起作用。试试下面的脚本
DECLARE @flag bit = 0
DECLRAE @person_ids varchar(100) = '1,2'
;WITH cte_1
AS
(SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS SplitValues
FROM
(SELECT CAST('<XMLRoot><RowData>' + REPLACE(@person_ids,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML)AS x)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n))
SELECT *
FROM file_table c
LEFT JOIN cte_1 c1 ON c.person_id=c1.SplitValues
WHERE c.person_id=CASE WHEN @flag=0 THEN c1.SplitValues ELSE c.person_id END
如果person\u id列包含整数值,则您的case语句将不起作用。试试下面的脚本
DECLARE @flag bit = 0
DECLRAE @person_ids varchar(100) = '1,2'
;WITH cte_1
AS
(SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS SplitValues
FROM
(SELECT CAST('<XMLRoot><RowData>' + REPLACE(@person_ids,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML)AS x)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n))
SELECT *
FROM file_table c
LEFT JOIN cte_1 c1 ON c.person_id=c1.SplitValues
WHERE c.person_id=CASE WHEN @flag=0 THEN c1.SplitValues ELSE c.person_id END
您可以使用下面的查询
declare @flag bit = 0
select * from file_table fd
where fd.person_id = case @flag when 1 then fd.person_id end
OR fd.person_id IN(1001,1002)
您可能需要“in”中的正确格式数据您可以使用下面的查询
declare @flag bit = 0
select * from file_table fd
where fd.person_id = case @flag when 1 then fd.person_id end
OR fd.person_id IN(1001,1002)
您可能需要在'in'中使用正确格式的数据。给出的答案基本上是如何避免语法错误,但您仍然会遇到错误,因为SQL不会解析变量中的文本。。。如果希望使用非静态值执行类似操作,则需要使用动态SQL。或者,使用两个单独的变量,并在@var1、@var2中使用,这将绕过语法错误。但是不返回任何结果集,尽管表中有这两个人ID的条目。你知道为什么吗?是大小写,不是大小写。因为它返回一个值!!!给出的答案基本上是如何避开语法错误,但仍然会有错误,因为SQL不会解析变量中的文本。。。如果希望使用非静态值执行类似操作,则需要使用动态SQL。或者,使用两个单独的变量,并在@var1、@var2中使用,这将绕过语法错误。但是不返回任何结果集,尽管表中有这两个人ID的条目。你知道为什么吗?是大小写,不是大小写。因为它返回一个值!!!这将绕过语法错误。但是不返回任何结果集,尽管表中有这两个人ID的条目。知道为什么吗?这可以避免语法错误。但是不返回任何结果集,尽管表中有这两个人ID的条目。你知道为什么吗?这有点重,但它会解决你的问题尝试并确认这有点重,但它会解决你的问题尝试并确认