[英]Executing IF statement in Where clause SQL Server
我怀疑这将适用于OP之后的工作,但是逻辑似乎很奇怪...
SELECT {Columns}
FROM YourTable YT
WHERE YT.Column1 = YT.Column2
OR (YT.Column3 = YT.Column4
AND NOT EXISTS(SELECT 1
FROM YourTable e
WHERE YT.id = e.id
AND e.Column1 = e.Column2));
但是,不确定性能会如何,因为您可能最终使用NOT EXISTS
进行表扫描。
好吧,根据评论,这是一种方法。
SELECT *
FROM Table1
WHERE Column1 = Column2
UNION
SELECT *
FROM Table2
WHERE Column1 != Column2 and Column3 = Column4
首先,您需要检查您的情况。 因此,您计算表中有多少C1 = C2
SELECT [id], COUNT(CASE WHEN C1 = C2 THEN 1 END) as c1_c2
FROM Table1
GROUP BY [id]
那你有两个条件
首先,当你有一些c1 = c2时,你会做
(c1 = c2 and c1_c2 > 0 )
当没有c1 = c2时第二个
(c1_c2 = 0 and c3 = c4)
SQL DEMO ::因为是OR
,c1_c2的计数决定将在何处工作。
WITH c12 as (
SELECT [id], COUNT(CASE WHEN C1 = C2 THEN 1 END) as c1_c2_cnt
FROM Table1
GROUP BY [id]
)
SELECT *
FROM Table1 T
JOIN c12 C
ON T.[id] = C.[id]
WHERE ( C.c1_c2_cnt > 0 and T.c1 = T.c2 )
OR ( C.c1_c2_cnt = 0 and T.c3 = T.c4 )
OUTPUT
另一种方法:
DECLARE
@t TABLE( ID INT, col1 CHAR(1), col2 CHAR(1), col3 INT, col4 INT)
INSERT INTO @t VALUES
(1234,'A','B',100,100),
(1234,'A','A',100,100),
(2468,'A','C',125,125),
(2468,'A','B',100,150)
SELECT
ID
, col1
, col2
, col3
, col4
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY ID, col1 ORDER BY col2) RN
FROM (
SELECT *
FROM @t
WHERE
col3 = col4
AND col1 = col2
UNION ALL
SELECT *
FROM @t
WHERE
col3 = col4
AND ID NOT IN(
SELECT ID
FROM @t
WHERE
col3 = col4
AND col1 = col2
)
) D
) E
WHERE
RN = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.