为什么不在CONVERT中进行比较?
是否可以在CONVERT或CAST函数中使用比较运算符?为什么不在CONVERT中进行比较?
我有看起来像这样的声明:
SELECT
...
CASE field
WHEN 'Y' THEN 1 # If Y then True
ELSE 0 # Anything else is False
END
...
FROM ...
类似的事情发生了几场,所以我想将其更改为一个较短的版本:
SELECT
...
CONVERT(BIT, field = 'Y')
...
FROM ...
但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
我认为你曲解的文档CONVERT
。 CONVERT
的文档中没有任何内容说明它将处理使用比较运算符的表达式,只是它接受表达式。事实证明,CONVERT
不处理每个有效的SQL表达式。至少它不能处理使用比较运算符的表达式的结果。
如果您检查Operators的文件,你会看到比较操作(这是你想要=
是什么,在这种情况下)返回Boolean
数据类型,并在WHERE子句和控制的使用流语句。从运营商的文档:
比较运算符的结果具有布尔数据类型,它有三个值: TRUE,FALSE,和UNKNOWN。返回布尔型数据类型的表达式称为 布尔表达式。
与其他SQL Server数据类型不同,不能将 指定为表列或变量的数据类型,并且不能在结果集中返回 。
...
表达式与布尔数据类型WHERE子句中用于 滤波器符合搜索条件,并在 控制流语言语句如if和while行.. 。
这有助于解释为什么像SELECT 1=2
SQL是无效的SQL,因为它会创建一个具有Boolean
数据类型,该文件说,是不允许的结果集。这也解释了为什么CASE WHEN构造是必需的,因为它可以评估比较运算符并返回SQL Server可以在结果集中返回的单个数据类型值。
此外,如果你看一下CONVERT的文件,你会看到Boolean
没有在任何CAST
或CONVERT
支持(请参阅向页面中间的桌子,没有Boolean
数据类型在那里)。
为了您的目的,我认为您被卡住使用CASE WHEN
。如果它可以帮助你可以写都放在同一行:
CASE WHEN field = 'Y' THEN 1 ELSE 0 END
或者,你可以创建一个UDF来处理CASE表达式(类似dbo.func_DoCase(field, 'Y', 1, 0)
),但我个人只想坚持与CASE WHEN
。
+1我怀疑你是对的。我正准备说这个,但你打败了我。 – Wiseguy 2012-01-06 03:45:50
@Wiseguy:谢谢。我知道SQL'SELECT CONVERT(BIT,1 = 2)'是无效的,但试图弄清楚为什么使用文档有点困难。 – rsbarro 2012-01-06 03:49:28
是的,你会认为文档会清楚地指出这一点,并且/或者抛出的错误会更有帮助。 “不正确的语法”听起来更像是一个简单的拼写错误,而不是“好的,你正确地组装了这些作品,但是出于非显而易见的原因,我不觉得有必要解释它们不属于这个特定的位置。” – Wiseguy 2012-01-06 03:59:21
field ='Y'是一个赋值,而不是表达式。在任何情况下,位数据类型只能包含0或1. CASE语句是正确的,因为它在field ='Y'时指定1。 – 2012-01-06 03:36:00