SQL——行值表达式(Row Value Expressions)
概述
最近接触了一个新概念——行值表达式,也叫做行值构造器。这是一个很强大的SQL功能,通常我们所操作的SQL表达式都只能针对一行中的单一字段进行操作比较,而行值表达式可以针对一行中的多个字段进行操作比较。
它在SQL:92的标准里就被定义过,但到目前为止,也并不是所有数据库都支持,并且每个数据库支持程度不一致。
这列出了几个支持行值表达式的数据库:
- DB2
- HSQLDB
- MySQL
- Oracle
- Postgres
查询语句示例
SELECT * FROM t
WHERE (t.t1, t.t2) IN (
SELECT u.u1, u.u2 FROM u
)
上面这个示例能够选出t表和u表中,字段相同的值。只用了一个表达式,就比较了两个字段。换成传统的写法就是:
SELECT * FROM t
WHERE EXISTS(
SELECT * FROM u
WHERE t.t1 = u.u1 AND t.t2 = u.u2
)
传统的写法也能实现同样的功能,但代码量就多了,传统的写法用了两个表达式,比较两个字段,并用AND连接。
更新语句示例(Mysql5.5 不支持)
UPDATE t
SET (t.t1, t.t2) =
('A', 'B')
WHERE ID = 10
上述示例是表t中,将字段ID=10的行中的t1修改成‘A’,t2修改成‘B’。传统的写法是:
UPDATE t
SET t.t1 = 'A', t.t2 = 'B'
WHERE ID = 10
行值表达式的比较
除了查询语句示例的IN用法外,行值表达式还可以使用=,!=,>,<,>=,<=等符号进行字段比较。
以下为TRUE:
(9, 9, 9) > (1, 1, 1)
('Bob', 'Bar') > ('Alan', 'Alert')
(3, 2, 1) != (4, 3, 2)
上述比较简单,一眼能看出真假,因为一一对应的元素比较都为真~
但其实比较行值表达式时,不必每个元素都为TRUE,越左边的元素越重要,只要靠左边的元素为TRUE,则整个表达式就为TRUE
以下也为TRUE:
(9, 1, 1) > (1, 9, 9)
('Zommer', 'Andy') > ('Alpert' , 'Zelda')
若第一位相同,比较第二位,以此类推,以下也为TRUE:
(1, 1, 2) > (1, 1, 1)
(1, 2, 1) > (1, 1, 1)
(1, 2, 1) > (1, 1, 2)
对于等表达式,必须所有元素都为TRUE,表达式才是TRUE:
(1, 2, 3) = (1, 2, 3)
对于不等表达式,只需要一个元素为TRUE,表达式就为TRUE:
(1, 2, 1) != (1, 1, 1)
下面用一个通用的行值表达式进行传统的转换,能更清晰的说明,行值表达式的比较是怎么运作的:
行值表达式:
(A, B, C) > (X, Y, Z)
对应的传统变换:
(A > X)
OR ((A = X) AND (B > Y))
OR ((A = X) AND (B = Y) AND (C > Z)) 行值表达式:
(A, B, C) >= (X, Y, Z)
对应的传统变换:
(A > X)
OR ((A = X) AND (B > Y))
OR ((A = X) AND (B = Y) AND (C > Z))
OR ((A = X) AND (B = Y) AND (C = Z))
由上可见,行值表达式在某些情况下相对于传统表达式有多方便。
参考资料:
Predicates with Row Value Expressions
SQL——行值表达式(Row Value Expressions)的更多相关文章
- 【sql server】"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行" 解决方案
#事故现场: 1.在手动修改某表中数据是,出现如下错误提示: 已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行 2.表结构及数据: #解决方法: 1.原因分析:提示被删除的行不是唯一行, ...
- Ms sql行转列。汇总
SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 ...
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...
- sql 行转列总结
原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- Sql 行转换为列 以及列转换为行的心得
这是 创建数据库的脚本文件 CREATE TABLE [dbo].[stu]( [学号] [nvarchar](255) NOT NULL, [姓名] [nvarchar](255) NULL, [性 ...
- SQL行转列 (及EAV模型获取数据)
参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列. ...
- SQL行转列,列转行
SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...
- SQL 行转列和列转行
SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...
- SQL NULL 值【摘自W3C】
SQL NULL 值 本章讲解 IS NULL 和 IS NOT NULL 操作符. NULL 值是遗漏的未知数据.默认地,表的列可以存放 NULL 值. 如果表中的某个列是可选的,那么我们可以在不向 ...
随机推荐
- CentOS7 下ifconfig command not found解决办法
今天尝鲜用VMWare安装了CentOS7,选择了最小安装包模式,安装完毕之后想查看一下本机的ip地址,发现报错 # ifcon -bash: ifconfig: command not found ...
- AVL Insight 开源情报工具:一站式情报管理服务
一.概要 AVL Insight 开源情报工具是安天移动安全推出的一款情报收集工具,它是配合AVL Insight移动威胁情报平台的Chrome浏览器扩展程序,用户可以使用该工具,对网站中的公开信息进 ...
- Xamarin 与VS2015RC(xamarin 3.11.450) 报空指针错误。
在Android开发中发现的一个“初步认为是调试器的bug”. 于早些时候发布在公司论坛上,传送门: http://www.newlifex.com/showtopic-1400.aspx 使用vs2 ...
- [原创]Centos7 从零编译Nginx+PHP+MySql
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- 毕业论文中使用的技术—FileReader接口
用来把文件读入内存,并且读取文件中的数据. FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据 FileReader接口的方法 方法名 参 ...
- [NHibernate]利用LINQPad查看NHibernate生成SQL语句
上篇文章中我们提到可以通过重写NHibernate的 EmptyInterceptor 拦截器来监控NHibernate发送给数据库的SQL脚本,今天看到有朋友用LINQPad工具来进行NHibern ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点
传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...
- LeetCode 389. Find the Difference
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...
- 1、Spring In Action 4th笔记(1)
Spring In Action 4th笔记(1) 2016-12-28 1.Spring是一个框架,致力于减轻JEE的开发,它有4个特点: 1.1 基于POJO(Plain Ordinary Jav ...