gpt4 book ai didi

sql - 为什么比较在 CONVERT 中不起作用?

转载 作者:行者123 更新时间:2023-12-04 13:38:53 24 4
gpt4 key购买 nike

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

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

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 子句和控制流语句。从运算符(operator)的文档中:

    The result of a comparison operator has the Boolean data type, which has three values: TRUE, FALSE, and UNKNOWN. Expressions that return a Boolean data type are known as Boolean expressions.

    Unlike other SQL Server data types, a Boolean data type cannot be specified as the data type of a table column or variable, and cannot be returned in a result set.

    ...

    Expressions with Boolean data types are used in the WHERE clause to filter the rows that qualify for the search conditions and in control-of-flow language statements such as IF and WHILE...



    这有助于解释为什么 SQL 喜欢 SELECT 1=2是无效的 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 .

    关于sql - 为什么比较在 CONVERT 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752742/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com