【问题标题】:Case Condition to join columns加入列的案例条件
【发布时间】:2016-07-30 03:44:57
【问题描述】:

消息 156,级别 15,状态 1,第 8 行 关键字“CASE”附近的语法不正确

我正在尝试根据列值连接列。

如果案例条件 1 为真,那么我想加入 ON im.ItemNumber = left(tr.itemnumber,len(tr.itemnumber)-4)

如果案例条件2为真,那么

开启 tr.ItemNumber = im.LegacyItemNumber

其他

tr.ItemNumber = im.ItemNumber

    SELECT 
           im.Category as RootCategory,GETDATE() AS LoadDate,tr.*  
          into transactionreport_stage_testNN
    FROM transaction tr
    LEFT OUTER JOIN ALLDW_ora.dbo.Location(NOLOCK) loc ON tr.location=loc.location

    CASE 
    when
    right(tr.itemnumber,4) = '_old' then 
    LEFT OUTER JOIN [Inventory](NOLOCK) im
    ON im.ItemNumber = left(tr.itemnumber,len(tr.itemnumber)-4)


    when 
    tr.itemnumber <> im.ItemNumber 
    then
    LEFT OUTER JOIN [Inventory](NOLOCK) im
    ON tr.ItemNumber = im.LegacyItemNumber

else
LEFT OUTER JOIN [Inventory](NOLOCK) im
ON tr.ItemNumber = im.itemnumber

    end 

    AND im.Location=loc.LocationNo

Schema

【问题讨论】:

  • This 回答可能会有所帮助。您可以在 case 中处理匹配条件,但不能切换查询的其他部分,例如表,威利尼利。您仍然可以加入所有内容并尝试在where 中解决问题,但有时事情会失控。
  • 另请注意,不推荐使用这种条件连接选项,几乎总是可以用其他方法(如联合)替换。 Sql 在基于集合的操作中表现得非常好,任何结构代码都会表现得更差。这种条件逻辑可以被视为 if...else。请查看这篇文章:例如simple-talk.com/sql/performance/…。您可以在 Internet 上找到更多信息。

标签: tsql join conditional case


【解决方案1】:

您可能应该只使用 AND 和 OR

LEFT OUTER JOIN [Inventory](NOLOCK) im ON im.Location=loc.LocationNo 
        AND (
            (right(tr.itemnumber,4) = '_old' AND im.ItemNumber = left(tr.itemnumber,len(tr.itemnumber)-4))
            OR 
            (tr.itemnumber <> im.ItemNumber AND tr.ItemNumber = im.LegacyItemNumber)
            OR
            (tr.ItemNumber = im.itemnumber)          
        )

可能就这么简单

SELECT  im.Category AS RootCategory,
        GETDATE() AS LoadDate,
        tr.*
INTO    #transactionreport_stage_testNN
FROM    [transaction] tr
        LEFT OUTER JOIN ALLDW_ora.dbo.Location (NOLOCK) loc ON tr.location = loc.location
        LEFT OUTER JOIN [Inventory] (NOLOCK) im ON im.Location = loc.LocationNo
            AND REPLACE(tr.itemnumber, '_old', '') IN (im.itemnumber, im.legacyitemnumber)

【讨论】:

  • 您好,感谢您的快速回复。我对代码进行了更改。
  • 我有三个条件,如果有条件你说的是对的。但我需要为条件使用不同的列
  • 哦,我明白你现在在说什么了......等一下
  • AND tr.ItemNumber = CASE WHEN 正确(tr.itemnumber,4) = '_old' THEN left(tr.itemnumber,len(tr.itemnumber)-4) 我需要加入 im。项目编号....
  • 两个让 im.itemnumber 和 im.legacyitemnumber 变得简单
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2011-07-30
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多