【问题标题】:why sql case condition gives error为什么sql case条件给出错误
【发布时间】:2016-09-29 11:37:24
【问题描述】:

我做了这样的事情,效果很好:

select nameOfCols 
from 
FACost
inner join  FAT as D  on d.nid=a.atypeid  
and
d.nid in (select item from SplitString('1,2,3,',',')) 

但是当我使用 case 来处理用户动态输入 '' 而不是 '1,2,3,' 的情况时。然后它在我的情况下给出错误

declare @selectedAssetTypeID varchar(50)='1,2,3,'
select nameOfCols 
from 
FACost
inner join  FAT as D  on d.nid=a.atypeid  
and
case when @selectedAssetTypeID<>'' then  d.nid in (select item from SplitString( @selectedAssetTypeID,',')) else d.nid=1 end     //error causing lines

错误是:

Msg 156, Level 15, State 1, Line 33
Incorrect syntax near the keyword 'in'.
Msg 156, Level 15, State 1, Line 33
Incorrect syntax near the keyword 'else'.

【问题讨论】:

  • A CASE 表达式 必须返回 SQL 数据类型的标量值(每行)。它不能返回评估谓词的结果,因为那将是一个布尔值 - 而 SQL Server 没有布尔数据类型。

标签: sql sql-server select stored-procedures


【解决方案1】:

您不能将in 子句与case 语句一起使用。因为Case 每条语句必须返回一个值(真或假)

您可以将查询分成两个块,也可以使用“OR”子句。

IF @selectedAssetTypeID = " "
BEGIN
     select nameOfCols 
     from FACost 
     inner join FAT as D  
      on (d.nid = a.atypeid)
     where d.nid = 1
END
ELSE
BEGIN
     select nameOfCols 
     from FACost 
     inner join FAT as D  
      on (d.nid = a.atypeid)
     where d.nid IN
     (select item from SplitString( @selectedAssetTypeID,','))
 END

你也可以使用“OR”子句

select nameOfCols 
     from FACost 
     inner join FAT as D  
      on (d.nid = a.atypeid)
     where ((@selectedAssetTypeID <>'' and  d.nid in (select item from SplitString(@selectedAssetTypeID,',')))
or (d.nid=1))

关于类似问题的讨论链接如下

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bc8a7a0b-1980-4481-a2df-6a5fde38f362/in-clause-in-case-statement?forum=sqlgetstarted

【讨论】:

    【解决方案2】:

    使用andor 条件而不是case 表达式。您所拥有的 case 表达式正在分配一个值 (else d.nid=1) 或检查真/假条件 (d.nid in (select item from SplitString( @selectedAssetTypeID,',')))。

    and (
    (@selectedAssetTypeID <>'' and  d.nid in (select item from SplitString( @selectedAssetTypeID,',')) )
    or (d.nid=1) 
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2016-03-22
      相关资源
      最近更新 更多