繁体   English   中英

在Where子句SQL Server中执行IF语句

[英]Executing IF statement in Where clause SQL Server

我只想返回不存在我的第一个条件的行,然后从同一张表返回新条件,以及其他条件:基本上...:

SELECT *   
FROM Table1     
WHERE

Condition#1: Column1=Column2

Condition#2: AND IF Column1 = Column2 doesn't exist (matching values for same ID) 
             THEN return results where Column3 = Column4

在此处输入图片说明

谢谢。

我怀疑这将适用于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

您可以使用简单的布尔值来做到这一点:

WHERE
Column1 = Column2
OR
Column3 = Column4

维恩图为此:

在此处输入图片说明

将返回所有阴影区域,包括当Column1 = Column2和Column3 = Column4时(深色阴影交叉点)

如果您不希望同时满足这两个条件的行,则可以修改逻辑:

WHERE
Column1 = Column2
OR
(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.

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