Sql server 案例在SQL Server中不起作用

Sql server 案例在SQL Server中不起作用,sql-server,tsql,Sql Server,Tsql,我正在尝试在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 Ty

我正在尝试在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

请尝试使用“IS NULL”而不是“=NULL”,以及使用“IS NOT NULL”而不是“NULL”。

为什么不对此查询使用联接:

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

如果您需要有关联接语法的帮助,这里有一个很棒的

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

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
如果您不熟悉连接语法,我会研究它

当SET ANSI_NULLS处于默认和标准设置时,您需要使用_column is NULL或_column NOT NULL构造将列与NULL进行比较


当SET ANSIU NULLS处于禁用状态时,Equals=和Not Equals可以工作,但这是非标准的。我建议不要更改ANSI_NULL的默认设置。

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

在本例中,我认为问题在于您正在使用“=”测试NULL,而ANSI_NULLS处于启用状态。如果您收到类似“关键字附近语法错误”和“关键字附近语法错误”的消息,那么我认为这是您的问题


如果是这样,你可以做几件事。1.关闭ANSI_NULLS。我不推荐这个。2.Change=NULL表示为NULL,NULL表示不为NULL。这是我推荐的方法。

定义不工作。这意味着错误吗?这是否意味着错误的结果?在这种情况下,请解释您得到了什么结果以及您期望得到什么。这个问题,就目前的情况而言,无法从您自己那里得到更详细的回答。您得到了什么错误?您应该使用joinselect NULL=NULL vs SELECT NULL IS重写此查询NULL@cory是的,相关子查询几乎总是一个坏主意。