Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql CASE语句不适用于“IN”_Sql_Sql Server - Fatal编程技术网

Sql CASE语句不适用于“IN”

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

下面的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,如下所示

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的条目。你知道为什么吗?这有点重,但它会解决你的问题尝试并确认这有点重,但它会解决你的问题尝试并确认