2

我是 SQL 的初学者,遇到了一个相当简单的条件问题:数据库中的每个安装号都有一个客户。但有人告诉我,客户要么在 AUDEB 表中,要么在 AFORD 表中。我应该首先在 AUDEB 中查找 CUSTOMER_NO 并在它不为 NULL 时使用它。如果为 NULL,则从 AFORD 表中获取 CUSTOMER_NO。

如果 CUSTOMER_NO 不为 NULL,则使用它

  SELECT CUSTOMER_NO
  FROM AUDEB
  WHERE INST_NO = 2

否则使用此 CUSTOMER_NO

  SELECT CUSTOMER_NO
  FROM AFORD
  WHERE INST_NO = 2

我看到 SQL 中存在 IF...ELSE 条件,但是如果结果不为空,是否有更简单的方法可以在两个查询的值之间进行选择,如果结果不为空,我想使用第一个,否则使用另一个?

4

3 回答 3

3

您可以union使用子查询来检索完整的客户列表:

select  CUSTOMER_NO
from    (
        select  CUSTOMER_NO
        ,       INST_NO
        from    AUDEB
        union all
        select  CUSTOMER_NO
        ,       INST_NO
        from    AFORD
        ) as all_customers
where   INST_NO = 2
于 2012-06-27T07:08:06.043 回答
2

如果这两个表遵循相同的模式并且customrer_no 中没有重叠,则可以使用UNION:

SELECT T.CUSTOMER_NO
  FROM (SELECT CUSTOMER_NO, INST_NO FROM AUDEB
        UNION
        SELECT CUSTOMER_NO, INST_NO FROM AFORD) AS T
  WHERE T.INST_NO = 2

或者如果 inst_no 可以在两个表中,则加入它们(即使模式不同)

SELECT COALESCE(T1.Customer_no, T2.CUSTOMER_NO)
FROM AUDEB as T1
FULL OUTER JOIN AFORD as T2
ON T1.INST_NO = T2.INST_NO
WHERE T1.INST_NO = 2 OR T2.INST_NO = 2

COALESCE 将返回第一个非空结果

于 2012-06-27T07:14:09.750 回答
1

只需连接两个表并使用 ISNULL() 从相应表中获取值。

SELECT ISNULL(A.CUSTOMER_NO, B.CUSTOMER_NO) AS CUSTOMER_NO
  FROM AUDEB A INNER JOIN AFORD B
    ON A.INST_NO = B.INST_NO
 WHERE A.INST_NO = 2

编辑:这假设 INST_NO 是主键,但现在评论中已经说明它不是。OP 应该使用正确的字段来加入这两个表。

于 2012-06-27T07:09:24.470 回答