如果行在SQL中为null,则并集



考虑到下面的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的结果将意味着相同的事情。

最新更新