如何让SQL子查询不比较NULL值?获取唯一人员数据
筛选唯一人员数据(排除已存在CPF,忽略NULL值)
需要一段返回唯一人员数据的脚本:CPF作为唯一标识符,但并非所有记录都登记了CPF。要求子查询不比较NULL值,后续将通过姓名做进一步验证。
现有查询如下,需要修改使其不处理NULL值的CPF比较:
SELECT * FROM TAB.ORIGEM WHERE NOT EXISTS ( SELECT 1 FROM TAB.DESTINO WHERE TAB.DESTINO.CPF = TAB.ORIGEM.CPF )
表结构与预期结果
TAB.ORIGEM
| NAME | CPF |
|---|---|
| JOAO | 123 |
| MARIA | 321 |
| PAULO |
TAB.DESTINO
| NAME | CPF |
|---|---|
| JOAO | 123 |
| JOANA | 456 |
| JOSE |
预期结果
| NAME | CPF |
|---|---|
| MARIA | 321 |
| PAULO |
修改后的查询
SELECT * FROM TAB.ORIGEM WHERE NOT EXISTS ( SELECT 1 FROM TAB.DESTINO WHERE TAB.DESTINO.CPF = TAB.ORIGEM.CPF AND TAB.ORIGEM.CPF IS NOT NULL )
逻辑说明
- 新增
AND TAB.ORIGEM.CPF IS NOT NULL条件后,当ORIGEM中的CPF为NULL时,子查询的匹配条件永远不成立,因此NOT EXISTS会返回真,这类记录会被保留(对应预期结果中的PAULO)。 - 对于CPF非NULL的记录,只有当DESTINO中不存在相同CPF值时,才会被筛选出来(比如MARIA的321在DESTINO中无匹配,被保留;JOAO的123存在匹配,被排除)。
内容的提问来源于stack exchange,提问作者thund3rbird777
相关产品推荐
相关产品推荐

