2012-01-06 100 views
6

是否可以在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 
+0

field ='Y'是一个赋值,而不是表达式。在任何情况下,位数据类型只能包含0或1. CASE语句是正确的,因为它在field ='Y'时指定1。 – 2012-01-06 03:36:00

回答

4

我认为你曲解的文档CONVERTCONVERT的文档中没有任何内容说明它将处理使用比较运算符的表达式,只是它接受表达式。事实证明,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没有在任何CASTCONVERT支持(请参阅向页面中间的桌子,没有Boolean数据类型在那里)。

为了您的目的,我认为您被卡住使用CASE WHEN。如果它可以帮助你可以写都放在同一行:

CASE WHEN field = 'Y' THEN 1 ELSE 0 END 

或者,你可以创建一个UDF来处理CASE表达式(类似dbo.func_DoCase(field, 'Y', 1, 0)),但我个人只想坚持与CASE WHEN

+0

+1我怀疑你是对的。我正准备说这个,但你打败了我。 – Wiseguy 2012-01-06 03:45:50

+0

@Wiseguy:谢谢。我知道SQL'SELECT CONVERT(BIT,1 = 2)'是无效的,但试图弄清楚为什么使用文档有点困难。 – rsbarro 2012-01-06 03:49:28

+0

是的,你会认为文档会清楚地指出这一点,并且/或者抛出的错误会更有帮助。 “不正确的语法”听起来更像是一个简单的拼写错误,而不是“好的,你正确地组装了这些作品,但是出于非显而易见的原因,我不觉得有必要解释它们不属于这个特定的位置。” – Wiseguy 2012-01-06 03:59:21

相关问题