我正在寻找一种方法来做一些像这样的事情,如果第一个条件没有匹配,做第二个。我们来举个例子。
我在查询中有这个JOIN:
SELECT A.COL1, A.COL2, B.COL1, B.COL2
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B)
ON B.COL1 = A.COL1
OR B.COL2 = A.COL2
你看,有了这个OR条件,我可以为同一个B
对象创建两个连接。我不希望这样。我想要的是:
答案 0 :(得分:1)
如果B.COL1 = A.COL1
则返回行。或者,如果B.COL1 <> A.COL1
但B.COL2 = A.COL2
也返回行。
SELECT A.COL1, A.COL2, B.COL1, B.COL2
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B) B
ON (B.COL1 = A.COL1)
OR (B.COL1 <> A.COL1 and B.COL2 = A.COL2)
答案 1 :(得分:1)
您需要在第二个过滤器中包含条件B.COL1 = A.COL1
的否定。天真地,这是B.COL1 <> A.COL1
,但这不会处理NULL
值,因此您需要像这样使用B.COL1 <> A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL
:
SELECT A.COL1, A.COL2, B.COL1, B.COL2
FROM A
FULL JOIN (SELECT COL1, COL2 FROM B)
ON ( B.COL1 = A.COL1
OR ( ( B.COL1 <> A.COL1 OR B.COL1 IS NULL OR A.COL1 IS NULL )
AND B.COL2 = A.COL2
)
)