Man*_*l M 18 mysql sql sql-server oracle
我在MySQL(也适用于更换当Oracle/MSSQL跨follwoing(有效)查询跌跌撞撞=用IN):
SELECT * from mytable WHERE (a, b)=(1,2)
Run Code Online (Sandbox Code Playgroud)
它是一样的
SELECT * from mytable WHERE a=1 and b=2
Run Code Online (Sandbox Code Playgroud)
我认为MySQL文档中的定义在这里:
simple_expr:
[...]
| (expr [, expr] ...)
[...]
Run Code Online (Sandbox Code Playgroud)
这个叫什么?使用它有什么利弊吗?
sag*_*agi 13
通过使用IN()以下方法将多个列与多个值组合进行比较时,它非常方便:
SELECT * FROM YourTable
WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)
Run Code Online (Sandbox Code Playgroud)
代替:
SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
(col1 = 2 and col2 = 3) OR
(col1 = 4 and col2 = 4) OR
....
Run Code Online (Sandbox Code Playgroud)
在查看了两个查询的执行计划之后,我可以说在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 |
Run Code Online (Sandbox Code Playgroud)
综合条件:
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 |
Run Code Online (Sandbox Code Playgroud)
我假设所有RDBMS都会对此查询进行相同的评估.
行构造函数在其他上下文中是合法的.例如,以下两个语句在语义上是等效的(并且由优化器以相同的方式处理):
所以:
缺点 - 可能对某些人来说可读性较差,但基本上没有缺点.
优点 - 减少代码,并使用以下方法组合多列比较IN():
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |