代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

有什么原因不能在SQLServer中选择语句作为位吗?

  •  5
  • Matt Mitchell  · 技术社区  · 14 年前

    我想知道为什么以下失败了:

    SELECT price<500 as PriceIsCheap
    

    SELECT CASE WHEN (price<500) THEN 1 ELSE 0 END as PriceIsCheap
    

    什么时候, as per the answer to this related question ,的 conversion table 表示应该发生隐式转换。

    4 回复  |  直到 7 年前
        1
  •  6
  •   Dean Harding    14 年前

    BIT NULL 是的 boolean logic 不可能(例如,如果 price 无效的 ?)

    注意,我不是说没有 可能的 实现“主要”工作的布尔逻辑的方法(例如,您可以这样说 TRUE OR NULL 无效的 或者不管怎样)仅仅是设计SQL标准的人不能决定布尔逻辑的一个真正的表示(例如,你也可以说 TRUE TRUE OR <anything> ).

    布尔表达式(=,<=>=,等)仅在某些地方有效(特别是, WHERE CASE 标签),而不是在任何其他地方。

        2
  •  3
  •   fyjham    14 年前

    IsCheap SELECT * FROM STUFF WHERE IsCheap ,你必须做 WHERE IsCheap=1 .

        3
  •  2
  •   onedaywhen    14 年前

    price < 500 返回一个 符合逻辑的 值:真、假或未知。它不是一个 CASE


    FWIW Microsoft Access数据库引擎确实将表达式的结果视为数据值,例如,您可以问各种古怪的问题,例如:

    SELECT 1 = 1, 1 = NULL, 1 <> NULL, 1 IN (NULL)
      FROM Foo;
    

    …它将很乐意提供答案,但这当然只是证明Access并没有实现SQL语言!

        4
  •  0
  •   Amadan    14 年前

    @帕斯迪亚布洛,这太不切题了。。。OP的例子只是一个极小的例子。这仍然是一个简单但真实的例子:考虑一个包含姓名和年龄的People表。你想得到所有的人,但也想知道他们是否未成年。在MySQL和PostgreSQL中,您可以编写

    SELECT name, age < 18 AS minor FROM people