选择不同的非空行 SQL Server 2005
我遇到了以下问题。
我有一个像这样的表:
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
PS 这里 ID 是主键,因此是唯一的。 ID1-ID5 - 任何整数。
提前致谢! 已更新
说 null 等于任何数字,我的意思是它被任何数字吸收。
I ran into the following problem.
I have a table like this:
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
And I need to get distinct rows it terms that NULL equals any value. For this example the answer is:
ID ID1 ID2 ID3 ID4 ID5
5 3 NULL NULL 2 1
6 NULL 5 NULL 2 NULL
P.S. Here ID is primary key hence unique. ID1-ID5 - any integers.
Thanks in advance!
UPDATED
Saying that null equals any number I mean that it's absorbed by any number.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这有效,不知道它是否可以变得更简单
编辑:找到一个更甜蜜的替代方案,如果你的id从来没有负数
编辑2:有一种情况它不起作用 - 如果有两行(具有不同的id)具有完全相同的形式。我假设它不存在。如果存在这种情况,则首先在基表上创建一个具有 select unique 的视图,然后应用此查询。
This works, don't know if it can be made any simpler
EDIT: Found a sweeter alternative, if your ids never have negative numbers
EDIT2: There is one case where it won't work - in case two rows (with different ids) have exact same form. I am assuming that it is not there. If such a thing is present, then first create a view with a select distinct on the base table first, and then apply this query.
据我了解,您的问题陈述:
您从完整的表开始:
然后消除“重复”行,即。具有较少值但与其他行相同的值的行(
NULL
除外 - 并且不包括ID
列):第 1 行被消除,因为第 3 行被删除相同,但在第 1 行具有
NULL
的位置具有更多值。第 2 行同样被第 2 行或第 4 行消除。
第 3 行和第 4 行被第 5 行消除。
。然后剩下第 5 行和第 6 行:
我的回答:
坦率地说,我不明白如何使用 SQL 的 SELECT DISTINCT,或者更一般地说,使用 SQL 的基于集合的逻辑。我可以想象您可能能够使用更程序化的方法(例如使用光标)来进行这种过滤 - 但我无法为此提供解决方案。
有关术语的说明:
NULL 永远不会等于任何值,因为 NULL 本身不是一个值;这是缺乏价值。 NULL 本质上意味着“未知”。 (由于 NULL 不是一个值,因此您不应编写
IDx = NULL
,而应编写IDx IS NULL
。)Statement of your problem as I understand it:
You start with the full table:
Then you eliminate "duplicate" rows, ie. rows that have less, but the same values as other rows (except
NULL
— and theID
column is not included):Row 1 is eliminated because row 3 is identical, but has more values in the places where row 1 has
NULL
.Row 2 likewise gets eliminated by (either of) row 2 or 4.
Row 3 and 4 are eliminated by row 5.
You're then left with rows 5 and 6:
My answer:
Frankly, I don't see how this could be done with SQL's
SELECT DISTINCT
, or more generally, with SQL's set-based logic. I could imagine that you might be able to do this kind of filtering with a more procedural approach (e.g. with cursors) — but I can't provide a solution for this.A note about terminology:
NULL never equals any value, because NULL is itself not a value; it is the absence of a value. NULL essentially means "unknown". (The fact that NULL is not a value is the reason why you shouldn't write
IDx = NULL
, butIDx IS NULL
instead.)如果 ID1、ID2 (...) 始终具有相同的值(如您的示例中所示),您可以执行此
操作 函数 SUM 和 COUNT 将忽略该空值。
但你的问题仍然有点困惑..:)
If ID1, ID2 (...) has always the same value, as in your example, you could do it
The functions SUM and COUNT will ignore that null values.
But still little confused your question.. :)