根据特定条件选择

时间:2019-04-05 13:43:12

标签: sql sql-server tsql

如果有人可以更新标题以更好地反映我的问题,将不胜感激。我认为我一直在努力寻找答案,因为我不知道正确的搜索词。

  

如果我在表中具有以下值:

TableID      TableSensitivity
-----------------------------
1            aSensitivity
1            aRevision
2            bRevision
3            cRevision
3            cSensitivity
     

如何为每个TableID过滤仅包含的“修订”值?   已经是一个包含“灵敏度”的值。这是预期的输出:

TableID      TableSensitivity
-----------------------------
1            aSensitivity
2            bRevision
3            cSensitivity

这是一个示例设置:

DECLARE  @Example TABLE (TableID INT, TableSensitivity VARCHAR(200))

INSERT INTO @Example(TableID, TableSensitivity) VALUES (1, 'aSensitivity')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (1, 'aRevision')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (2, 'bRevision')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (3, 'cSensitivity')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (3, 'cRevision')

我尝试使用CASE来确定具有敏感性的行,并发现我可以使用MAX进行过滤,但无法使其起作用:

SELECT TableID
     , TableSensitivity
     , CASE WHEN TableSensitivity LIKE '%Sensitivity' THEN 1 ELSE 0 END 'SomeKey' 
FROM @Example

4 个答案:

答案 0 :(得分:3)

您可以使用WHERE NOT EXISTS

SELECT TableID
     , TableSensitivity
FROM @Example e1
WHERE NOT EXISTS
(
    SELECT *
    FROM @Example e2
    WHERE e1.TableID=e2.TableID
    AND e2.TableSensitivity LIKE '%Sensitivity'
    AND e1.TableSensitivity LIKE '%Revision'
)

答案 1 :(得分:2)

这将摆脱@Example中的行并返回您的预期结果。可以根据需要对其进行修改并应用于您的查询中:

DELETE
FROM    @Example
WHERE   TableID IN
        (
            SELECT  TableID
            FROM    @Example
            WHERE   TableSensitivity LIKE '%Sensitivity%'
        )
        AND TableSensitivity LIKE '%Revision%'

SELECT  *
FROM    @Example

答案 2 :(得分:1)

这也可以使用FIRST_VALUE函数(对于SQL Server 2012及更高版本)实现

SELECT DISTINCT 
    TableID, 
    FIRST_VALUE(TableSensitivity) OVER (PARTITION BY TableID ORDER BY 
            CASE WHEN  TableSensitivity LIKE '%Sensitivity' THEN 1 
            WHEN TableSensitivity LIKE '%Revision' THEN 2 
            ELSE 3 END) as TableSensitivity
FROM @Example

答案 3 :(得分:0)

最初,我完全误解了这个问题。我知道,您需要一个优先级查询。一种简单的方法是:

$a.model.dataSources.type

更通用的方法是使用select e.* from @example e where e.TableSensitivity like '%Sensitivity' union all select e.* from @example e where e.TableSensitivity like '%Revision' and not exists (select 1 from @example e2 where e2.tableId = e.tableId and e2.TableSensitivity like '%Sensitivity' );

row_number()