在SQL Server中值等于或为null时对行进行分组

时间:2019-02-18 12:42:45

标签: sql-server

在Sql Server中,我试图按ID对匹配行进行分组。

空值被认为是通配符。

说明:匹配的行是什么意思?

匹配行意味着–即使两行的所有列都匹配。

匹配列的平均值–相同的值('A'='A')或每个值都为空值('A'/'B'/'C'/ ... = NULL)。

在我的示例中:

第1行与第2行匹配– 因为:

第一列:“ A” =“ A”

第二列:“ B” = NULL

第三列:NULL ='C'

第1行与第4行匹配:

第一列:“ A” =“ A”

第二列:'B'!='D'

第三列:NULL = NULL。

比较失败,因为第二列中的值不匹配。

有人可以帮助我使用sql吗?

例如:

用于创建测试表:

create table test_table (
    id int,
    column1 varchar(20),
    column2 varchar(20),
    column3 varchar(20)
);

insert into test_table (id, column1, column2, column3) values 
(1, 'A', 'B', NULL),
(2, 'A',NULL, 'C'),
(3, 'A', 'B', 'D'),
(4, NULL, 'D', NULL),
(5, 'A', 'B', 'D');

例如表格

the table

这是预期的结果:

group id 1: {1,2}
group id 2: {1,3,5}
group id 3: {2,4}

不是该组:{1,2,3}。

表中预期结果的示例:

expected result in a table

1 个答案:

答案 0 :(得分:1)

每当一个值为NULL时,您都需要跳过特定的列连接条件,因此只需在OR中使用几个IS NULL。试试这个:

SELECT
    T1.id,
    T2.id
FROM
    test_table AS T1
    INNER JOIN test_table AS T2 ON
        (T1.column1 = T2.column1 OR T1.column1 IS NULL OR T2.column1 IS NULL) AND
        (T1.column2 = T2.column2 OR T1.column2 IS NULL OR T2.column2 IS NULL) AND
        (T1.column3 = T2.column3 OR T1.column3 IS NULL OR T2.column3 IS NULL)
WHERE
    T1.id < T2.id -- Only display relationships in one way (<)

这不是组操作(如您的标题所示),它是记录之间的联接。