简体   繁体   English

WHERE子句中的动态SQL

[英]Dynamic SQL in WHERE clause

SELECT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A, TABLE B
WHERE B.COL1 = A.COL1
AND B.COL2 = A.COL2
AND B.COL3 - A.COL3
AND B.COL4 = A.COL4

Now I want to tune the SQL query, that whenever any of the Columns in Table B has field value 'ALL' the where clause will not come into picture. 现在,我想调整SQL查询,以便每当表B中的任何列的字段值为'ALL'时,where子句都不会出现。

ie When it has a distinct value it will match with both the tables, when the field value is 'ALL' then to exclude from the where clause. 即,当它具有不同的值时,它将与两个表匹配,当字段值为“ ALL”时,则从where子句中排除。

Alternatively, 或者,

I Need B.COL1= A.COL1 (When B.COL1 <> 'ALL')
Else NO WHERE clause with B.Col1 = A.Col1 (When B.COL1 = 'ALL')

Use OR wisely: 明智地使用OR:

SELECT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A, TABLE B
WHERE (B.COL1 = A.COL1 OR B.COL1='ALL')
AND (B.COL2 = A.COL2 OR B.COL2='ALL')
...

I would also suggest learning JOIN syntax. 我也建议学习JOIN语法。


Hi, 你好
You can use case statement to have a condition in where clause, 您可以使用case语句在where子句中添加条件,

    SELECT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A, TABLE B
WHERE B.COL1 = 
              CASE 
              WHEN B.COL1 <> 'ALL' THEN A.COL1
              ELSE NULL
              END
      AND B.COL2 = A.COL2
      AND B.COL3 - A.COL3
      AND B.COL4 = A.COL4

You can achieve this with just IN: 您可以仅通过IN来实现:

SELECT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A, TABLE B
WHERE B.COL1 IN (A.COL1, 'ALL')
AND B.COL2 IN (A.COL2, 'ALL')
AND B.COL3 IN (A.COL3, 'ALL')
AND B.COL4 IN (A.COL4, 'ALL')

What is actually going on may be more clear with a more verbose version using AND/OR , but the logic is exactly the same 使用AND/OR详细版本可能会更清楚地说明实际情况,但是逻辑是完全相同的

SELECT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A, TABLE B
WHERE (B.COL1 = A.COL1 OR B.COL1 = 'ALL')
AND (B.COL2 = A.COL2 OR B.COL2 = 'ALL')
AND (B.COL3 = A.COL3 OR B.COL3 = 'ALL')
AND (B.COL4 = A.COL4 OR B.COL4 = 'ALL')

Simple solution: 简单的解决方案:

SELECT DISTINCT A.COL1, A.COL2, A.COL3, A.COL4
FROM TABLE A
INNER JOIN TABLE B ON 
(B.COL1 = A.COL1 AND B.COL2 = A.COL2 AND B.COL3 = A.COL3 AND B.COL4 = A.COL4)
OR
('ALL' IN (B.COL1, B.COL2, B.COL3, B.COL4))

but, if you work with large tables that complex filtering could slow down very much the execution, so I suggest to use a different syntax for complex JOINs 但是,如果您使用大型表,那么复杂的过滤会大大降低执行速度,因此我建议对复杂的JOIN使用不同的语法

SELECT DISTINCT * 
FROM (
    SELECT A.COL1, A.COL2, A.COL3, A.COL4
    FROM A 
    INNER JOIN B 
    ON (B.COL1 = A.COL1 AND B.COL2 = A.COL2 AND B.COL3 = A.COL3 AND B.COL4 = A.COL4)
) J1

UNION -- ALL ?

SELECT DISTINCT * 
FROM (
    SELECT A.COL1, A.COL2, A.COL3, A.COL4
    FROM A 
    INNER JOIN B ON ('ALL' IN (B.COL1, B.COL2, B.COL3, B.COL4))
) J2 

This one should be much faster than previous one. 这应该比上一个快得多。

Also, I wonder about row duplicates.. with that syntax each row of table A will be added to result as many times as many rows in table B contains 'ALL' 此外,我想知道行重复..用这种语法,表A的每一行将被添加,以使表B中的所有行包含“ ALL”的次数增加

I have added the DISTINCT clause to the SELECT to avoid duplicates (same problem affects UNION operator), so if you need duplicates, remove DISTINCT and use UNION ALL instead of UNION 我已将DISTINCT子句添加到SELECT以避免重复(同一问题影响UNION运算符),因此,如果需要重复,请删除DISTINCT并使用UNION ALL而不是UNION

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM