gpt4 book ai didi

sql - 有没有办法将空值等同于 SQL 分区中的非空值?

转载 作者:行者123 更新时间:2023-12-04 03:57:06 25 4
gpt4 key购买 nike

我有一个人员记录数据库表,其中包含 UserID、FirstName、LastName、DOB 和 Email 地址列。 FirstName、LastName 和 Email 是必填值,但如果此人未提供该信息,则 DOB 可以为 null,因此几行可能如下所示:

FirstName          LastName           DOB               Email                      UserID
John Doe 1990-01-01 johndoe@gmail.com 1
Jane Doe 1990-02-01 janedoe@gmail.com 2
John Doe NULL johndoe@gmail.com 3
Paul Blart 1985-01-01 mallcop@gmail.com 4
Clark Kent NULL ImNotSuperman@gmail.com 5
Paul Blart 1985-01-01 mallcop@gmail.com 6

我正在尝试编写一个查询(这是一个更大程序的一部分)来识别数据库中重复的人员记录。要求 FirstName、LastName 和 Email 必须相同,如果 DOB 有值,则它必须相同,但如果为空,它仍然可以标记为重复。所以在上表中,将选择两个 John Doe 和两个 Paul Blart。我想在分区语句中执行此操作。所以我最初的尝试是:

SELECT  COUNT(UserID) OVER (Partition BY FirstName, LastName, DOB, Email) AS Count,
DENSE_RANK() OVER (ORDER BY FirstName, LastName, DOB, Email) AS RANK,
UserID, FirstName, LastName, DOB, Email
FROM People
where COUNT(UserID) OVER (Partition BY FirstName, LastName, DOB, Email) > 1

它正确地选择了 Paul Blart 的重复项而不是 John Doe 的重复项,因为其中一个的 DOB 值为空。有什么方法可以正确选择这些记录吗?

最佳答案

这可能更简单地用 exists 表示:

select t.*
from mytable t
where exists (
select 1
from mytable t1
where
t1.id <> t.id
and t1.firstname = t.firstname
and t1.lastname = t.lastname
and t1.email = t.email
and (t1.dob = t.dob or t1.dob is null or t.dob is null)
)

关于sql - 有没有办法将空值等同于 SQL 分区中的非空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63691195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com