检查查询中的列值是否在每一行中都相同

时间:2017-10-10 16:55:59

标签: sql-server sql-server-2008-r2

我希望能够根据SQL中第一行的值,查看整个行集合中列的值是否相同。

目前,我根据此similar question的答案使用以下查询。

SELECT CASE
    WHEN NOT EXISTS(
        SELECT * FROM dbo.Table
        WHERE colA = 'valueA'
        AND colD <> (
            SELECT TOP 1 colD
            FROM dbo.Table
            WHERE LTRIM(colA) = 'valueA'
            AND colB = 'valueB'
            AND (
                colC = 'valueC1'
                OR colC = 'valueC2'
                ... OR colC = 'valueCn'
            )
        )
        AND colB = 'valueB'
        AND (
            colC = 'valueC1'
            OR colC = 'valueC2'
            ... OR colC = 'valueCn'
        )
    ) THEN 'Y'
    ELSE 'N'
END AS my_result

到目前为止,我已经能够测试了,但是我只使用了一些测试用例。它也不是很可扩展,这可能是一个问题,因为colC可能有数百个值。

是否有另一个命令或方法可以在SQL中更好地处理这个问题,或者将内部SELECT语句拉入自己的查询中更好,然后将结果添加到外部{{ 1}}在另一个结果查询中的语句?或者,我一开始就错了吗?

这是在SQL Server 2008 R2 SP3中,我已将其添加为标记。我正在寻找一个声明,它最好返回一些我可以评估的布尔值,类似于此语句当前返回SELECTY的方式。但是,如果有一个更好的解决方案需要不同的输出,我很可能会调整以解决这个问题。我更关心的是拥有一个好的,可扩展的解决方案。

Used_By_Already有一个良好的开端,但是我不会提前知道数据是什么,所以我需要一个纯动态的解决方案。

为此计划的用例是为NcolA提供单个值,为colB提供n个值,结构始终为colC。这些值用于从colA AND colB AND (colC1 OR colC2 OR...colCn)检索第一个日期时间,然后根据colD中的每个值进行检查,再次按第一个查询中的条件进行筛选。在第一次查询完成之前,我不会知道colD中日期时间的值。

我在进入此查询之前提前获得的唯一信息是colDcolA,以及colB的每个值。 colC始终至少有一个值,但可能有数百个值。我需要检查由colC语句过滤的每个实例是否都记录在同一日期时间对象的系统中,或者它们是否不同。我不知道那个日期时间到底是什么,而且说实话,发生时无关紧要,只要每次发生都是相同

SQL Fiddle

WHERE

查询1

CREATE TABLE Example
    ([colA] nvarchar(20), [colB] nchar(1), [colC] smallint, [colD] datetime)
;

INSERT INTO Example
    ([colA], [colB], [colC], [colD])
VALUES
    ('123610', 'S', '1', '2017-06-17 11:53:52'),
    ('123610', 'S', '2', '2017-06-17 11:53:52'),
    ('123610', 'R', '3', '2017-06-17 11:53:52'),
    ('123610', 'S', '4', '2017-06-17 11:53:52'),
    ('123611', 'S', '1', '2017-06-17 11:53:52'),
    ('123610', 'S', '5', '2017-06-14 11:53:52'),
    ('123610', 'S', '3', '2017-06-17 11:53:52'),
    ('123610', 'S', '7', '2017-06-15 11:53:52'),
    ('123610', 'S', '8', '2017-06-17 11:53:52'),
    ('123610', 'S', '9', '2017-06-17 11:53:52')
;

Results

SELECT CASE
    WHEN NOT EXISTS(
        SELECT * FROM Example
        WHERE colA = '123610'
        AND colD <> (
            SELECT TOP 1 colD
            FROM Example
            WHERE colA = '123610'
            AND colB = 'S'
            AND (
                colC = '1'
                OR colC = '2'
                OR colC = '7'
                OR colC = '5'
            )
        )
        AND colB = 'S'
        AND (
            colC = '1'
            OR colC = '2'
            OR colC = '7'
            OR colC = '5'
        )
    ) THEN 'Y'
    ELSE 'N'
END AS my_result

查询2

|my_result|
|---------|
|    N    |

Results

SELECT CASE
    WHEN NOT EXISTS(
        SELECT * FROM Example
        WHERE colA = '123610'
        AND colD <> (
            SELECT TOP 1 colD
            FROM Example
            WHERE colA = '123610'
            AND colB = 'S'
            AND (
                colC = '1'
                OR colC = '2'
                OR colC = '3'
                OR colC = '8'
            )
        )
        AND colB = 'S'
        AND (
            colC = '1'
            OR colC = '2'
            OR colC = '3'
            OR colC = '8'
        )
    ) THEN 'Y'
    ELSE 'N'
END AS my_result

查询3

|my_result|
|---------|
|    Y    |

Results

SELECT CASE
    WHEN NOT EXISTS(
        SELECT * FROM Example
        WHERE colA = '123610'
        AND colD <> (
            SELECT TOP 1 colD
            FROM Example
            WHERE colA = '123610'
            AND colB = 'S'
            AND (
                colC = '1'
                OR colC = '4'
                OR colC = '3'
                OR colC = '8'
            )
        )
        AND colB = 'S'
        AND (
            colC = '1'
            OR colC = '4'
            OR colC = '3'
            OR colC = '8'
        )
    ) THEN 'Y'
    ELSE 'N'
END AS my_result

1 个答案:

答案 0 :(得分:0)

借用类似问题的样本数据我设置了以下内容:

SQL Fiddle

CREATE TABLE Table1
    ([ID] varchar(4), [Status] int)
;

INSERT INTO Table1
    ([ID], [Status])
VALUES
    ('y123', 2),
    ('y432', 2),
    ('y531', 2),
    ('y123', 2),
    ('n123', 1),
    ('n432', 3),
    ('n531', 2),
    ('n123', 2)
;

查询1

select 
  coalesce(
            (select 'Y' as yn
              from (
                select count(distinct [Status]) yn
                from table1
                where id like 'y%'                 -- data for yes
                having count(distinct [Status]) = 1
                ) as yn)
          ,'N')

<强> Results

|   |
|---|
| Y |

查询2

select 
  coalesce(
            (select 'Y' as yn
              from (
                select count(distinct [Status]) yn
                from table1
                where id like 'n%'                 -- data for no
                having count(distinct [Status]) = 1
                ) as yn)
          ,'N')

<强> Results

|   |
|---|
| N |