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 } expressionbinary_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)
我认为您误解了 的文档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.
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |