我遇到了以下问题 我有一张这样的桌子:
ID ID1 ID2 ID3 ID4 ID5
1 NULL NULL NULL NULL 1
2 NULL NULL NULL 2 NULL
3 NULL NULL NULL 2 1
4 3 NULL NULL 2 NULL
5 3 NULL NULL 2 1
6 NULL 5 NULL 2 NULL
我需要获得不同的行,即NULL等于任何值。对于这个例子,答案是:
ID ID1 ID2 ID3 ID4 ID5
5 3 NULL NULL 2 1
6 NULL 5 NULL 2 NULL
P.S。这里ID是主键因此是唯一的。 ID1-ID5 - 任何整数。
提前致谢!
已更新
如果说null等于任何数字,我的意思是它被任何数字吸收。
答案 0 :(得分:4)
这有效,不知道是否可以做得更简单
SELECT ID1, ID2, ID3, ID4, ID5
FROM IDS OUTT
WHERE NOT EXISTS (SELECT 1
FROM IDS INN
WHERE OUTT.ID != INN.ID AND
(ISNULL(OUTT.ID1, INN.ID1) = INN.ID1 OR (INN.ID1 IS NULL AND OUTT.ID1 IS NULL)) AND
(ISNULL(OUTT.ID2, INN.ID2) = INN.ID2 OR (INN.ID2 IS NULL AND OUTT.ID2 IS NULL)) AND
(ISNULL(OUTT.ID3, INN.ID3) = INN.ID3 OR (INN.ID3 IS NULL AND OUTT.ID3 IS NULL)) AND
(ISNULL(OUTT.ID4, INN.ID4) = INN.ID4 OR (INN.ID4 IS NULL AND OUTT.ID4 IS NULL)) AND
(ISNULL(OUTT.ID5, INN.ID5) = INN.ID5 OR (INN.ID5 IS NULL AND OUTT.ID5 IS NULL)))
编辑:如果你的ids永远不会有负数,那就找到一个更甜蜜的选择
SELECT ID1, ID2, ID3, ID4, ID5
FROM IDS OUTT
WHERE NOT EXISTS (SELECT 1
FROM IDS INN
WHERE OUTT.ID != INN.ID AND
coalesce(OUTT.ID1, INN.ID1,-1) = isnull(INN.ID1,-1) AND
coalesce(OUTT.ID2, INN.ID2,-1) = isnull(INN.ID2,-1) AND
coalesce(OUTT.ID3, INN.ID3,-1) = isnull(INN.ID3,-1) AND
coalesce(OUTT.ID4, INN.ID4,-1) = isnull(INN.ID4,-1) AND
coalesce(OUTT.ID5, INN.ID5,-1) = isnull(INN.ID5,-1))
EDIT2:有一种情况它不起作用 - 如果两行(具有不同的ID)具有完全相同的形式。我假设它不存在。如果存在这样的事情,则首先在基表上首先创建一个具有select distinct的视图,然后应用此查询。
答案 1 :(得分:1)
您从完整的表格开始:
ID ID1 ID2 ID3 ID4 ID5
1 NULL NULL NULL NULL 1
2 NULL NULL NULL 2 NULL
3 NULL NULL NULL 2 1
4 3 NULL NULL 2 NULL
5 3 NULL NULL 2 1
6 NULL 5 NULL 2 NULL
然后你消除“重复”行,即。与其他行相比较少但值相同的行(NULL
除外 - 并且不包括ID
列):
第1行被删除,因为第3行相同,但在第1行有NULL
的地方有更多值。
第2行同样被(第2行或第4行)消除。
第5行删除第3行和第4行。
然后你会留下第5行和第6行:
ID ID1 ID2 ID3 ID4 ID5
5 3 NULL NULL 2 1
6 NULL 5 NULL 2 NULL
坦率地说,我不知道如何使用SQL的SELECT DISTINCT
,或者更普遍的是,使用SQL的基于集合的逻辑。我可以想象你可以用更多的程序方法(例如使用游标)进行这种过滤 - 但我无法为此提供解决方案。
关于术语的说明:
NULL等于任何值
NULL永远等于任何值,因为NULL本身不是值;这是没有价值的。 NULL本质上意味着“未知”。 (NULL不是值的事实是你不应该写IDx = NULL
,而是写IDx IS NULL
的原因。)
答案 2 :(得分:0)
如果ID1,ID2(...)始终具有相同的值(如您的示例所示),则可以执行此操作
Select
SUM(id1)/COUNT(id1),
SUM(id2)/COUNT(id2),
SUM(id3)/COUNT(id3),
SUM(id4)/COUNT(id4),
SUM(id5)/COUNT(id5) From TABLE
SUM和COUNT函数将忽略该空值。 但仍然很困惑你的问题.. :)