考虑到下面的SQL查询,Person将有一个个人或公司。考虑到这一点,我提出这个查询是为了统一数据。我希望它只有TaxNumber列的非空行(来自个人或公司(。但是查询返回两列,一列为null,另一列为带值。
SELECT
PR.Id AS PersonId,
PR.Title AS PersonTitle,
IA.TaxNumber AS TaxNumber,
CP.TaxNumber AS TaxNumber
FROM
person AS PR
LEFT JOIN individual AS IA ON IA.PersonID = PR.Id
LEFT JOIN company AS CP ON CP.PersonID = PR.Id
您的术语有点偏离,这很可能是寻找解决方案的问题的一部分。UNION组合了数据集{1,3,5}UNION{2,4}给了我们{1,2,3,4,5}。你想"组合";列,其中一个为NULL。Coalesce()
有效地做到了这一点。
Coalesce()
将返回在一系列对象中遇到的第一个非null值。Coalesce()
与数据库无关(意味着它在大多数RDBMS中都有(。但是,如果它不起作用:请指定您使用的RDBMS;可能还有类似的函数。
SELECT
PR.Id AS PersonId,
PR.Title AS PersonTitle,
Coalesce(IA.TaxNumber, CP.TaxNumber) AS TaxNumber
FROM
person AS PR
LEFT JOIN individual AS IA ON IA.PersonID = PR.Id
LEFT JOIN company AS CP ON CP.PersonID = PR.Id
示例:
+---------------+---------------+---------+
| IA Tax number | CP Tax number | Returns |
+---------------+---------------+---------+
| 123 | <NULL> | 123 |
| <NULL> | 456 | 456 |
| 987 | 654 | 987 |
| <NULL> | <NULL> | <NULL> |
+---------------+---------------+---------+
因此,如果您希望CP税号优先,只需切换合并中的顺序即可。Coalesce(CP.TaxNumber, IA.TaxNumber,'MISSING' )
| 987 | 654 | 654 |
| <NULL> | <NULL> | MISSING |
注意,如果我们想调出双方的数据,我添加了第三个选项"丢失"。但CCD_ 5的结果将意味着相同的事情。