CAS表达式、SQL运算符、NULL标记、同时操作

CASE表达式

CASE 表达式是一个标量表达式,返回一个基于条件逻辑的值。CASE 表达式具有“简单”和“搜索”两种格式。
CASE 简单格式在 CASE 关键字后具有单个测试值或表达式,与 WHEN 子句中的可能值列表进行比较,并返回第一个匹配值。如果列表中没有值等于测试值,CASE 表达式返回 ELSE 子句中的值。如果 CASE 表达式没有 ELSE 子句,则默认为 ELSE NULL。

SELECT productid, productname, categoryid,
    CASE categoryid
        WHEN 1 THEN 'Beverages'
        WHEN 2 THEN 'Condiments'
    ELSE 'Unknown Category' END
FROM Production.Products

CASE 搜索格式更加灵活,因为它允许在 WHEN 子句中指定谓词或逻辑表达式,而不是限制于进行相等比较。CASE 表达式返回第一个 WHEN 逻辑表达式计算结果为 TRUE 的相关联 THEN 子句中的值。如果没有 WHEN 表达式计算结果为 TURE,CASE 表达式返回 ELSE 子句中的值(如果未指定 ELSE 子句则返回NULL)。

SELECT orderid, custid, val,
    CASE
        WHEN val < 1000.00 THEN 'Less than 1000'
        WHEN val BETWEEN 1000.00 AND 3000.00 THEN 'Between 1000 and 3000'
        WHEN val > 3000.00 THEN 'More than 3000'
        ELSE 'Unknown'
    END AS valuecategory
 FROM Sales.OrderValues;

运算符

SQL Server运算符优先级(从高到低):

  1. ()(圆括号)
  2. *(乘法)、/(除法)、%(取模)
  3. +(正号)、-(负号)、+(加法)、+(串联)、-(减法)
  4. =、>、<、>=、<=、<>、!=、!>、!<(比较运算符,后三种不是标准的)
  5. NOT
  6. AND
  7. BETWEEN、IN、LIKE、OR
  8. =(赋值)

NULL

SQL 支持用于表示缺失值的 NULL 标记,并使用三值逻辑,即谓词可以计算为TRUE、FALSE、UNKNOWN。
SQL 不同语言元素对于 UNKNOWN 有不同的处理方式。对于查询筛选而言,SQL 正确处理定义是“接受TRUE”,意味着 FALSE 和 UNKNOWN 会被筛选掉。相反,对于 CHECK 约束而言,SQL 的正确处理定义是“拒绝FALSE”,意味着 TRUE 和 UNKNOWN 会被接受。
当否定 UNKNOWN 时,仍然会得到 UNKNOWN 值,NOT UNKNOWN 仍然是 UNKNOWN。比较两个 NULL 标记的表达式(NULL=NULL)计算为 UNKNOWN,因为 NULL 表示缺失值或未知值,不能够说一个未知值是否等于另一个值。因此,SQL 提供了谓词 IS NULL 和 IS NOT NULL 来代替=NULL 和 <>NULL。
在比较和排序目的的不同语言元素中,SQL 处理 NULL 标记的方式也不一致。一些元素处理两个 NULL 标记时认为他们是不同的,另一些则认为它们彼此相等(GROUP BY、ORDER BY)。GROUP BY 子句将所有 NULL 标记排列为一组,并且 ORDER BY 子句也将所有 NULL 标记排序在一起。

同时操作

SQL 支持一个叫做同时操作(all-at-once operations)的概念,即出现在同一逻辑处理阶段的所有表达式在同一时间点进行逻辑计算。例:

SELECT col1, col2 FROM T1 WHERE col1 <> 0 AND col2/col1 > 2  -- col1、col2为整数列,col1可能等于0

SQL Server 不支持短路运算,基于标准 SQL 的同事操作概念,SQL Server 可以按任意顺序自由处理 WHERE 子句中的表达式。SQL Server 通常基于成本估计对此作出决定,即通常是成本低的表达式先计算。CASE 表达式中的 WHEN 子句的计算顺序是有保证的,可以通过 CASE WHEN 的方式避免除0错误。更好的方法是用数学方法来避免除0错误:

SELECT col1, col2 FROM T1 WHERE (col1 > 0 AND col2 > 2*col1) OR (col1 < 0 AND col2 < 2*col1);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值