条件检索

时间:2018-02-01 05:39:49

标签: sql sql-server

我有一个现有冗长的查询,可以检索这样的东西(使它看起来更短)。

Field1 Field2 Key
------ ------ --- 
R      NULL   2
T      CAF21  2
R      NULL   1
R      NULL   3

场景:
R行可能并不总是有T行。但是,如果每个键都存在T行,则会使用T行。

我应该只为每个T数据显示Key行。 但是,如果T不存在Key,我应该显示R数据。

如何通过查询实现此目的?

预期产出:

  

条件1:我会检索那些Key已存在的T

 Field1 Field2 Key
 ------ ------ ---
 T      CAF21  2
  

条件2:我将检索仅Key

R
 Field1 Field2 Key
 ------ ------ ---
 R      NULL   3
 R      NULL   1

2 个答案:

答案 0 :(得分:2)

USE ROW_NUMBERPartition By如下:

您必须根据您的要求使用以下两个字段,并根据需要应用于条件:

RANK() OVER (Partition BY keyvalue order by CASE field1 WHEN 'T' THEN 0 ELSE 1 END) AS PartNo,
CASE field1 WHEN 'T' THEN 1 ELSE 2 END AS fieldValue;

整个查询:

DECLARE @tblQuestion AS Table
(
    field1 varchar(20),
    field2 VARCHAR(50),
    keyvalue INT
)

INSERT INTO @tblQuestion VALUES('R',NULL,2)
INSERT INTO @tblQuestion VALUES('T','CAFR',2)
INSERT INTO @tblQuestion VALUES('R',NULL,1)
INSERT INTO @tblQuestion VALUES('R',NULL,3)


;WITH T AS
(
    SELECT 
        field1,
        field2,
        keyvalue,
        ROW_NUMBER() OVER (Partition BY keyvalue order by CASE field1 WHEN 'T' THEN 0 ELSE 1 END) AS PartNo,
       CASE field1 WHEN 'T' THEN 1 ELSE 2 END AS fieldValue
    FROM @tblQuestion
)

SELECT 
    *
FROM T  

<强>输出:

enter image description here

答案 1 :(得分:1)

另一种方法是使用UNION

SELECT FIELD1, FIELD2, KEY
FROM YOUR_TABLE
WHERE FIELD1 = 'T'
UNION
SELECT FIELD1, FIELD2, KEY
FROM YOUR_TABLE
WHERE KEY NOT IN (SELECT DISTINCT KEY FROM YOUR_TABLE WHERE FIELD1 = 'T');