【问题标题】:Case Statement in JOINJOIN 中的案例语句
【发布时间】:2016-03-15 20:55:35
【问题描述】:

我有这个问题:

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_fkbil.BillingAccountStatus_fk 列的结果集中覆盖NULLs,因为并非Billing tbl 中的所有内容都存在于构建表中。

因此在下面编写了以下查询,但收到此错误消息。

消息 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;

【问题讨论】:

  • 你的逻辑有多个错误,比如= NULL
  • CASE 不是一个语句,它是一个函数/表达式。它应该返回一个值,而不是尝试分配值。
  • 你不能使用这样的 case 表达式。你有这么多问题在这里很难解决。全局临时表。由于并发问题,这些都是非常有问题的。你有 NOLOCK 乱扔垃圾。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere 您有条件检查列 = NULL 的位置。这不起作用,因为没有任何东西 = NULL。那些需要使用 ISNULL 或 COALESCE,
  • 另外,很多人不知道,但布尔/(条件真值)在 SQL 中不是有效的数据类型,不能从表达式/函数返回。

标签: sql sql-server join case


【解决方案1】:

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

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; 

【讨论】:

  • 感谢您的解决方案。但目标是在 bil.Building_fk 为 NULL 时替换 bil.BillingAccountStatus_fk 列中的 NULL。
  • 然后将该 case 语句移至该字段并翻转该 Else 以指向该其他字段。
【解决方案2】:

我猜你正在尝试做这样的事情:

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 的错误用法留到另一天 ...

【讨论】:

  • 我知道与 nolock 使用有关的问题,但我在 prod 工作,所以我被要求在不放 nolock 的情况下永远不要运行任何东西....
  • 我尝试了您的查询,它已成功执行,但 bil.BillingAccountStatus_fk 列中的 NULL 未被替换...我需要将“bil.building_fk = NULL”中的“=”替换为“ bil.building_fk 为空”?刚刚尝试使用“IS NULL”并没有帮助替换 NULL。
【解决方案3】:

CASE 表达式不能用于设置用于JOIN 的条件,它们可以用于JOIN 条件中比较运算符的任一侧,但我认为您不需要,我认为您只需要在您的SELECT 中添加一个LEFT JOIN 和一个COALESCE()

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_fk 双方都来自bil,因此将其从JOIN 标准中删除。

【讨论】:

  • 目标是当 bil.Building_fk 为 NULL 时,替换 bil.BillingAccountStatus_fk 列中的 NULLs
  • 这就是这个查询的作用:COALESCE() 返回集合中的第一个非空值,在这种情况下,如果 bil.BillingAccountStatus_fk 为空,则返回“不在计费中”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多