WHERE子句中的动态SQL

时间:2016-09-29 08:12:58

标签: sql db2

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

现在我想调整SQL查询,只要表B中的任何列具有字段值'ALL',where子句就不会出现。

即。当它具有不同的值时,它将与两个表匹配,当字段值为“ALL”时,则从where子句中排除。

可替换地,

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

4 个答案:

答案 0 :(得分:0)

明智地使用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')
...

我还建议学习JOIN语法。

答案 1 :(得分:0)

嗨,您可以使用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

答案 2 :(得分:0)

只需使用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')

使用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')

答案 3 :(得分:0)

简单的解决方案:

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))

但是,如果你使用大型表,复杂的过滤可能会大大减慢执行速度,所以我建议对复杂的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 

这个应该比前一个快得多。

此外,我想知道行重复..使用该语法,表A中的每一行将被添加到结果中,表B中的行包含&#39; ALL&#39;

我已将DISTINCT子句添加到SELECT以避免重复(同一问题影响UNION运算符),因此如果您需要重复项,请删除DISTINCT并使用{ {1}}代替UNION ALL