所以我有两个表,两个表都有一个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编号前面应有一个0
:0123456780000
,当它存储在数据库中时会被切断。
因此,对于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 }}?
答案 0 :(得分:1)
我如何发表评估bb.cocnumber每个单元格的陈述 单独查看是否有匹配的8位aa.cocnumber?
您可以对LEFT JOIN
进行bb
到aa
的{{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)