比较 4 个或更多列的值

use*_*859 7 sql-server t-sql

我有一张像:

ID   A0  A1  A2 A3 A4
14   A   B   A  C  A
15   A   A   A  A  A
Run Code Online (Sandbox Code Playgroud)

我需要比较所有 5 列并检查它们是否具有相同的值并检索唯一具有所有相同值的列......在这种情况下 ID 为 15 的列。有没有办法在 T-SQL 中实现这一点?

Vér*_*ace 12

我不熟悉 SQL Server 的 SQL 品牌,但它必须是这样的:

SELECT ID FROM My_Table 
WHERE 
(A0 = A1) AND
(A1 = A2) AND
(A2 = A3) AND
(A3 = A4);
Run Code Online (Sandbox Code Playgroud)

查看此dbfiddle.uk,其中显示了答案线程中的所有答案。


Pau*_*ite 11

鉴于样本数据:

CREATE TABLE dbo.Data
(
    ID integer PRIMARY KEY,
    A0 character(1) NULL,
    A1 character(1) NULL,
    A2 character(1) NULL,
    A3 character(1) NULL,
    A4 character(1) NULL
);

INSERT dbo.Data
    (ID, A0, A1, A2, A3, A4)
VALUES
    (14, 'A', 'B', 'A', 'C', 'A'),
    (15, 'A', 'A', 'A', 'A', 'A');
Run Code Online (Sandbox Code Playgroud)

比较所有非 ID 列是否相等的另一种方法是:

SELECT
    D.*
FROM dbo.Data AS D
WHERE EXISTS
(
    -- All columns except the last one
    SELECT D.A0, D.A1, D.A2, D.A3
    INTERSECT
    -- All columns except the first one
    SELECT D.A1, D.A2, D.A3, D.A4
);
Run Code Online (Sandbox Code Playgroud)

如果有很多列,这可能比具有多个AND子句的查询更容易编写(并且通常更紧凑)。在 Management Studio 中,您可以将“列”节点从对象资源管理器拖到文本窗口以生成逗号分隔的列列表。抵消第二部分的列表INTERSECT也是微不足道的。

此查询生成的执行计划与多AND子句版本一样有效。在语义上,它略有不同,因为NULL数据项将彼此相等。

执行计划


Bog*_*nov 5

我可以建议另一种解决方案。您可以使用COMPUTED COLUMN. 当然,这是如果您可以修改表结构并且您会经常进行这种比较。

在 中,COMPUTED COLUMN您可以计算需要比较的所有列是否包含相同的数据boolean value。之后,您只需在查询中比较该值。

此外,如果您设置persistent option了该值,则每次更改数据时都会计算并存储该值。在这种情况下,将会有存储开销。

关于COMPUTED COLUMNS你可以在这里阅读例如

编辑: 作为Vérace伊恩林格罗塞说-如果有一个filtered indexCOMPUTED COLUMN(在这种情况下它必须是persistent)你可以受益性能。当然要有足够的数据量。