我偶然发现了MySQL中的以下(有效)查询(在用IN
替换=
时也适用于Oracle/MSSQL ):
SELECT * from mytable WHERE (a, b)=(1,2)
它与
SELECT * from mytable WHERE a=1 and b=2
我认为MySQL docs中的定义如下:
simple_expr:
[...]
| (expr [, expr] ...)
[...]
这叫什么?使用它有什么优点和缺点吗?
发布于 2016-07-06 15:20:31
当需要使用IN()
将多个列与多个值组合进行比较时,它会非常方便:
SELECT * FROM YourTable
WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)
而不是:
SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
(col1 = 2 and col2 = 3) OR
(col1 = 4 and col2 = 4) OR
....
在查看了这两个查询的执行计划之后,我可以说在Oracle中(使用基本上相同的IN()
),优化器以相同的方式进行计算,并且两者都使用索引:
单独的条件:
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where t.tt_id = '1' and t.region_name = 'one';
6 | 0 | SELECT STATEMENT | | 1 | 311 | 30 (0)| 00:00:01 |
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE | 1 | 311 | 30 (0)| 00:00:01 |
8 | 2 | INDEX RANGE SCAN | DIM_REMEDY_TICKETS_HISTORYPK | 1 | | 20 (0)| 00:00:01 |
组合条件:
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where (t.tt_id,t.region_name) in (('1','one'))
6 | 0 | SELECT STATEMENT | | 1 | 311 | 30 (0)| 00:00:01 |
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE | 1 | 311 | 30 (0)| 00:00:01 |
8 | 2 | INDEX RANGE SCAN | DIM_REMEDY_TICKETS_HISTORYPK | 1 | | 20 (0)| 00:00:01 |
我假设所有的RDBMS都会对这个查询进行相同的评估。
行构造函数在其他上下文中是合法的。例如,以下两个语句在语义上是等价的(并且由优化器以相同的方式进行处理):
所以:
缺点-对于一些人来说可读性可能较差,但基本上没有缺点。
无优点的代码,并结合多列比较使用IN()
:
https://stackoverflow.com/questions/38218030
复制相似问题