为什么CONVERT中的比较不起作用?

Wil*_*Cau 6 sql sql-server-2008

是否可以在CONVERT或CAST函数中使用比较运算符?

我有一个看起来像这样的声明:

SELECT
    ...
    CASE field
        WHEN 'Y' THEN 1  # If Y then True
        ELSE 0           # Anything else is False
    END
    ...
FROM ...
Run Code Online (Sandbox Code Playgroud)

类似的事情发生在几个字段,所以我想将其更改为更短的版本:

SELECT
    ...
    CONVERT(BIT, field = 'Y')
    ...
FROM ...
Run Code Online (Sandbox Code Playgroud)

但MSSQL发出了错误 Incorrect syntax near '='.

我对这个帮助的解释是它应该有效:

  • CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
  • expression: expression { binary_operator } expression
  • binary_operator:是一个运算符,它定义了两个表达式组合以产生单个结果的方式.binary_operator可以是算术运算符,赋值运算符(=),按位运算符,比较运算符,逻辑运算符,字符串连接运算符(+)或一元运算符.
  • comparison operator: ( = | > | < | >= | <= | <> | != | !< | !> )

我运行了一些测试并得到了这些结果:

SELECT CONVERT(BIT, 0)       // 0
SELECT CONVERT(BIT, 1)       // 1
SELECT CONVERT(BIT, 1+2)     // 1
SELECT CONVERT(BIT, 1=2)     // Error
SELECT CONVERT(BIT, (1=2))   // Error
SELECT CONVERT(BIT, (1)=(2)) // Error
Run Code Online (Sandbox Code Playgroud)

rsb*_*rro 4

我认为您误解了 的文档CONVERT。文档中没有任何内容说明CONVERT它将处理使用比较运算符的表达式,只是它接受一个表达式。事实证明CONVERT并不能处理每个有效的 SQL 表达式。至少它无法处理使用比较运算符的表达式的结果。

如果您检查Operators的文档,您将看到比较运算符(=在本例中就是您想要的)返回Boolean数据类型,并在 WHERE 子句和流控制语句中使用。来自操作员文档:

比较运算符的结果具有布尔数据类型,它具有三个值:TRUE、FALSE 和 UNKNOWN。返回布尔数据类型的表达式称为布尔表达式。

与其他 SQL Server 数据类型不同,布尔数据类型不能指定为表列或变量的数据类型,也不能在结果集中返回。

...

具有布尔数据类型的表达式在 WHERE 子句中用于过滤符合搜索条件的行,并在控制流语言语句(例如 IF 和 WHILE...)中使用。

这有助于解释为什么 SQL likeSELECT 1=2是无效的 SQL,因为它会创建一个具有某种Boolean数据类型的结果集,而文档称这是不允许的。这也解释了为什么 CASE WHEN 构造是必要的,因为它可以评估比较运算符并返回 SQL Server 可以在结果集中返回的数据类型的单个值。

此外,如果您查看CONVERT的文档,您会发现或Boolean都不支持它(请参阅页面中间的表格,其中没有数据类型)。CASTCONVERTBoolean

出于您的目的,我认为您一直在使用CASE WHEN. 如果有帮助,您可以将其全部写在一行上:

CASE WHEN field = 'Y' THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建一个 UDF 来处理 CASE 表达式(类似于dbo.func_DoCase(field, 'Y', 1, 0)),但我个人会坚持使用CASE WHEN.