Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 如何在where子句中使用Case语句赋值_Sql_Sql Server_Tsql_Ssms - Fatal编程技术网

Sql 如何在where子句中使用Case语句赋值

Sql 如何在where子句中使用Case语句赋值,sql,sql-server,tsql,ssms,Sql,Sql Server,Tsql,Ssms,我试图实现的逻辑是,如果greatPlainsUserId不为null,则使用它,否则使用userName,但我会得到语法错误 ... WHERE (CASE WHEN @greatPlainsUserId IS NULL THEN BUYERID = @userName ELSE BUYERID = @greatPlainsUserId END) AND... 卸下外壳。只要使用简单的逻辑: WHERE ((@greatPlains

我试图实现的逻辑是,如果
greatPlainsUserId
不为null,则使用它,否则使用
userName
,但我会得到语法错误

    ...
    WHERE (CASE
    WHEN @greatPlainsUserId IS NULL 
    THEN BUYERID = @userName 
    ELSE BUYERID = @greatPlainsUserId
    END)
    AND...

卸下
外壳
。只要使用简单的逻辑:

WHERE ((@greatPlainsUserId IS NULL AND BUYERID = @userName) OR
       (BUYERID = @greatPlainsUserId)
      )
第二个条件仅在
@greatPlainsUserId不为NULL时有效,因此该条件是冗余的

或者:

WHERE BUYERID = COALESCE(@greatPlainsUserId, @userName)

这可能是最简单的逻辑。

删除
案例。只要使用简单的逻辑:

WHERE ((@greatPlainsUserId IS NULL AND BUYERID = @userName) OR
       (BUYERID = @greatPlainsUserId)
      )
第二个条件仅在
@greatPlainsUserId不为NULL时有效,因此该条件是冗余的

或者:

WHERE BUYERID = COALESCE(@greatPlainsUserId, @userName)
这可能是最简单的逻辑。

只要使用
ISNULL()
它就可以处理这两种情况。运行下面的测试代码以查看。如果IssCost不为空,它将使用IssCost。如果为空,则会显示“Boooo!”

很抱歉我的懒惰示例数据,我已经制作了数据,不想对其进行太多修改:)

只需使用
ISNULL()
即可解决这两种情况。运行下面的测试代码以查看。如果IssCost不为空,它将使用IssCost。如果为空,则会显示“Boooo!”

很抱歉我的懒惰示例数据,我已经制作了数据,不想对其进行太多修改:)


它可能是语义,但它是一个case表达式,而不是case语句,它是一个表达式,因为它返回一个值。即使是微软也犯了这个错误,但我认为,将其称为声明会导致人们试图像您所做的那样将其作为控制流来使用。如需进一步阅读,请参阅-基本上您只需使用类似于
的case,其中BUYERID=(当@greatPlainsUserId为NULL时,则为@userName ELSE@greatPlainsUserId END)
。。这基本上就是BUYERID=ISNULL(@greatPlainsUserId,@userName)
所做的事情。一个
case
表达式返回一个值,但不支持
boolean
。在
join
条件中使用
case
的示例如下。(有一种数据类型(值为TRUE、FALSE和UNKNOWN),但您无法牢牢把握其中一种类型:“与其他SQL Server数据类型不同,布尔数据类型不能指定为表列或变量的数据类型,也不能在结果集中返回。”)它可能是语义,但它是一个case表达式,而不是case语句,它是一个表达式,因为它返回一个值。即使是微软也犯了这个错误,但我认为,将其称为声明会导致人们试图像您所做的那样将其作为控制流来使用。如需进一步阅读,请参阅-基本上您只需使用类似于
的case,其中BUYERID=(当@greatPlainsUserId为NULL时,则为@userName ELSE@greatPlainsUserId END)
。。这基本上就是BUYERID=ISNULL(@greatPlainsUserId,@userName)
所做的事情。一个
case
表达式返回一个值,但不支持
boolean
。在
join
条件中使用
case
的示例如下。(有一种数据类型(值为TRUE、FALSE和UNKNOWN),但您无法牢牢把握其中一种类型:“与其他SQL Server数据类型不同,布尔数据类型不能指定为表列或变量的数据类型,也不能在结果集中返回。”)