Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql JOIN中的Case语句_Sql_Sql Server_Join_Case - Fatal编程技术网

Sql JOIN中的Case语句

Sql JOIN中的Case语句,sql,sql-server,join,case,Sql,Sql Server,Join,Case,我有一个疑问: Select b.building_pk, bil.building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT From [DB].[Schema].Building b (nolock) left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk join ##GlobalTempTable1 tt (nolock) on t

我有一个疑问:

Select b.building_pk, bil.building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock)
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk
Order by b.building_pk; 
它很好用。但是我想覆盖
bil.building\u fk
bil.BillingAccountStatus\u fk
列中结果集中的
NULL
s,因为并不是Billing tbl中的所有内容都存在于building表中

所以写了下面的查询,但是得到了这个错误消息

Msg 102,15级,状态1,第7行“=”附近的语法不正确

请帮忙

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock)
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk
left Join [DB].[Schema].Billing bil (nolock) ON
CASE
    WHEN bil.building_fk IS NOT NULL 
        THEN bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk
    WHEN bil.building_fk IS NULL
        THEN bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing'
    END
ORDER BY b.building_pk;

很难说出你想做什么,因为这是非常错误的。不过,我认为您希望保持您的
FROM
不变,并在SELECT中执行
CASE
语句

Select b.building_pk, CASE WHEN bil.Building_fk IS NULL THEN 'Not in Billing' ELSE bil.building_fk END as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock)
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk
Order by b.building_pk; 
或者,最好在此处使用
COALESCE()

Select b.building_pk, COALESCE(bil.Building_fk,'Not in Billing') as building_fk, bil.BillingAccountStatus_fk, b.ACTL_TNT_CT 
From [DB].[Schema].Building b (nolock)
left Join [DB].[Schema].Billing bil (nolock) on bil.building_fk = b.building_pk
join ##GlobalTempTable1 tt (nolock) on tt.Building_fk = b.building_pk
Order by b.building_pk; 

CASE
表达式不能用于设置用于
联接的条件,它们可以用于
联接
条件中比较运算符的任一侧,但我认为您不需要,我认为您只需要在
选择
中使用
左联接
合并()

SELECT b.building_pk
     , bil.building_fk As [BLD Key from Billing]
     , COALESCE(bil.BillingAccountStatus_fk,'Not in Billing')
     , b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b 
join ##GlobalTempTable1 tt 
   ON tt.Building_fk = b.building_pk
left Join [DB].[Schema].Billing bil 
   ON bil.building_fk = b.building_pk
ORDER BY b.building_pk;

编辑:注意到
BillingAccountStatus\u fk
来自两侧的
bil
,因此从
JOIN
标准中删除了它。

我猜您正在尝试这样做:

SELECT b.building_pk, bil.building_fk As [BLD Key from Billing], bil.BillingAccountStatus_fk, b.ACTL_TNT_CT As [ActualTenantCount] 
FROM [DB].[Schema].Building b (nolock)
join ##GlobalTempTable1 tt (nolock) ON tt.Building_fk = b.building_pk
left Join [DB].[Schema].Billing bil (nolock) ON
    (bil.building_fk IS NOT NULL AND 
        (bil.building_fk = b.building_pk AND bil.BillingAccountStatus_fk = bil.BillingAccountStatus_fk))
    OR (bil.building_fk IS NULL AND
        (bil.building_fk = NULL AND bil.BillingAccountStatus_fk = 'Not in Billing'))
ORDER BY b.building_pk;

我将把
nolock
的错误用法留到另一天…

您的逻辑中有多个错误,例如
=NULL
。CASE不是一个语句,它是一个函数/表达式。它应该返回一个值,而不是试图赋值。不能使用这样的大小写表达式。你们这里有这么多问题,很难全部解决。全局临时表。由于并发性问题,这些问题非常严重。你不能乱扔东西。您有条件检查列=NULL的位置。这将不起作用,因为nothing=NULL。那些需要使用ISNULL或COALESCE的人也不知道,但是boolean/(条件真值)在SQL中不是有效的数据类型,不能从表达式/函数返回。感谢您的解决方案。但目标是在bil.Building_fk为NULL时替换bil.BillingAccountStatus_fk列中的NULL。然后将该case语句移到该字段,并将其翻转到另一个字段。我知道与nolock使用相关的问题,但我正在prod中工作,因此,我被要求在不放置nolock的情况下永远不要运行任何东西……我尝试了您的查询,结果成功执行,但bil.BillingAccountStatus_fk列中的null没有被替换。。。是否需要将“bil.building\u fk=NULL”中的“=”替换为“bil.building\u fk为NULL”?仅使用“IS NULL”进行尝试对NULL替换没有帮助。目标是在bil.Building\u fk为NULL时替换bil.BillingAccountStatus\u fk列中的NULL。这就是此查询所做的:
COALESCE()
返回集合中的第一个非NULL值,在本例中,如果
bil.BillingAccountStatus\u fk
为空,则返回“不在账单中”