左联接中的案例声明

时间:2020-01-07 17:35:22

标签: sql-server

所以我有两个表,两个表都有一个cocnumber或ChamberOfCommerce-number。这始终是8位数字,例如12345678。但是,存在一个问题:第一个表aa具有正确的8位数字的COC号,但是第二个表bb具有11或12位数字的COC号的混合。 11和12位数字的末尾有四个0,这是不相关的。

示例11位数的COC: 12345670000

示例12位数COC: 123456780000

但是为什么会有11位数的COC号码?好吧,没有。发生的情况是,11位数的COC编号前面应有一个00123456780000,当它存储在数据库中时会被切断。

因此,对于12位数的COC号码,我只截断了最后4位数。但是对于11位数的COC号码,我必须剪掉最后4位数字,并在该COC号码前添加一个0。

我的问题是我如何在LEFT JOIN内制作一个执行此操作的CASE语句?

这就是我所拥有的:

SELECT
  aa.cocnumber,
  bb.emloyeesnrtotal AS bb_emloyeesnrtotal

FROM aa
  LEFT JOIN bb ON aa.cocnumber = 
            CASE 
                WHEN LEN(bb.cocnumber) = 12
                    THEN LEFT(bb.cocnumber, 8)
                WHEN LEN(bb.cocnumber) = 11
                    THEN '0' + LEFT(bb.cocnumber, 7)
                END

这似乎无法产生正确的结果。谁能帮我指出我做错了什么?我想我在这里用了整个bb.cocnumber列的长度,但是我该如何做一个语句来分别评估bb.cocnumber的每个单元格,以查看是否有匹配的8位数字{{1 }}?

3 个答案:

答案 0 :(得分:1)

我如何发表评估bb.cocnumber每个单元格的陈述 单独查看是否有匹配的8位aa.cocnumber?

您可以对LEFT JOIN进行bbaa的{​​{1}}并检查不匹配的行(反之亦然):

SELECT
  bb.cocnumber
FROM bb LEFT JOIN aa 
ON aa.cocnumber = CASE 
  WHEN LEN(bb.cocnumber) = 12 THEN LEFT(bb.cocnumber, 8)
  WHEN LEN(bb.cocnumber) = 11 THEN '0' + LEFT(bb.cocnumber, 7)
END
WHERE LEN(bb.cocnumber) IN (11, 12) AND aa.cocnumber IS NULL

这将返回所有bb.cocnumber,它们在您进行转换后与任何aa.cocnumber不匹配。

答案 1 :(得分:0)

我假设表bb将cocnumber字段存储为整数,这就是为什么缺少前导零的原因。

如果只使它们全部以12位数字开头,然后取剩下的8个字符,则更容易,那么您就不必担心case语句:

SELECT
aa.cocnumber,
bb.emloyeesnrtotal AS bb_emloyeesnrtotal
FROM aa
LEFT JOIN bb ON aa.cocnumber = LEFT(RIGHT('000000000000' + CAST(bb.cocnumber AS VARCHAR), 12), 8)

答案 2 :(得分:0)

我认为将表aa的cocnumber转换为整数会更容易:

SELECT
  aa.cocnumber,
  bb.emloyeesnrtotal AS bb_emloyeesnrtotal
FROM aa
  LEFT JOIN bb ON CAST(aa.cocnumber as int) = FLOOR(bb.cocnumber/10000)
相关问题