0

我正在尝试在 sql 中编写 if..else 条件如果它们是 companyID 中的 companyID 为 NULL,我想从“Company”表中获取公司名称打印“N/A”con 有人帮助我

SELECT [contactID]
      ,[customerID]
      ,(SELECT Label.labelContactType FROM  Label WHERE Label.labelContactTypeID = Customer_Contacts.labelContactTypeID)AS Type
      ,[contactDetails]
      ,[status]
      ,[notes]
      ,CASE WHEN [Customer_Contacts].companyID = NULL THEN 'N/A'
        WHEN [Customer_Contacts].companyID  <> NULL THEN (SELECT [companyName]
        FROM [TaskManagementSystem_DB].[dbo].[Company] WHERE [Company].companyID = [Customer_Contacts].companyID)
        END AS Company

  FROM [TaskManagementSystem_DB].[dbo].[Customer_Contacts]

  WHERE customerID = 24
4

5 回答 5

8

尝试使用 'IS NULL' 代替 '= NULL',并使用 'IS NOT NULL' 代替 '<> NULL'。

于 2012-12-17T20:58:07.010 回答
3

为什么不只使用 aJOIN进行此查询:

SELECT cc.[contactID]
    ,cc.[customerID]
    ,l.labelContactType AS Type
    ,cc.[contactDetails]
    ,cc.[status]
    ,cc.[notes]
    , COALESCE(cp.[companyName], 'N/A') AS Company
FROM [TaskManagementSystem_DB].[dbo].[Customer_Contacts] cc
LEFT JOIN [TaskManagementSystem_DB].[dbo].[Company] cp
    on cc.companyID = cp.companyID
LEFT JOIN Label l
    on cc.labelContactTypeID = l.labelContactTypeID
WHERE cc.customerID = 24

如果您需要连接语法方面的帮助,这里是连接的一个很好的可视化解释

于 2012-12-17T20:59:32.657 回答
1

我真的会用JOINs 重写它:它更具可读性、可维护性并且效率更高。您当前所做的是实现相关子查询(其中两个;一个用于标签,一个用于公司名称)。这是用JOINs 重写并重新格式化以提高可读性的查询:

SELECT 
    cust.[contactID]
    ,cust.[customerID]
    ,l.labelContactType AS Type
    ,cust.[contactDetails]
    ,cust.[status]
    ,cust.[notes]
    ,ISNULL(comp.companyName, 'N/A') AS Company
FROM 
    [TaskManagementSystem_DB].[dbo].[Customer_Contacts] cust
LEFT JOIN
    [TaskManagementSystem_DB].[dbo].[Label] l
    ON
    cust.labelContactTypeID = l.labelContactTypeID
LEFT JOIN
    [TaskManagementSystem_DB].[dbo].[Company] comp
    ON
    cust.companyID = comp.companyID
WHERE 
    cust.customerID = 24

JOIN如果你不熟悉它,我会研究它的语法。

于 2012-12-17T21:02:25.350 回答
1

你没有说“不工作”是什么意思。确切地说出“不工作”的意思很重要 - 返回不正确的结果?抛出错误?

在这种情况下,我认为问题在于您使用 '=' 测试 NULL 并且 ANSI_NULLS 为 ON。如果您收到类似“关键字'then'附近的语法不正确”和'关键字'as'附近的语法不正确'之类的消息,那么我认为这是您的问题。

如果是这种情况,您可以做几件事。1. 转ANSI_NULLS OFF。我不推荐这个。2. 将 =更改NULLIS NULL和。这是我推荐的方法。<> NULLIS NOT NULL

于 2012-12-17T21:31:18.743 回答
0

何时SET ANSI_NULLS为 ON(默认和标准设置)您需要使用a_column IS NULLa_column IS NOT NULL构造比较具有 NULL 的列。

关闭时SET ANSI_NULLS,等于 ( =) 和不等于 ( <>) 有效 - 但它是非标准的。我建议不要更改 ANSI_NULL 的默认设置。

于 2012-12-17T21:22:19.373 回答