连接 table 上不存在的行的 CASE 语句
CASE statement for rows not existing on joined table
我试图用外部 CASE
语句包装下面的内部 CASE
语句,如果在左连接 OtherTable C
,相反,当在 OtherTable C
中找不到行时,它正在输出 ----
(只是破折号)。
SELECT A.INV_ITEM_ID,
CASE WHEN C.INV_ITEM_ID '' THEN '00-00-00-00-00'
ELSE ( CONCAT(CASE WHEN C.STORAGE_AREA like '[0-9]'
THEN '0'+ C.STORAGE_AREA
WHEN C.STORAGE_AREA = '' THEN '00'
ELSE C.STORAGE_AREA END ,'-', CASE WHEN C.STOR_LEVEL_1 like '[0-9]'
THEN '0' + C.STOR_LEVEL_1
WHEN C.STOR_LEVEL_1 = '' THEN '00'
ELSE C.STOR_LEVEL_1 END , '-',
CASE WHEN C.STOR_LEVEL_2 like '[0-9]'
THEN '0' + C.STOR_LEVEL_2
WHEN C.STOR_LEVEL_2 = '' THEN '00'
ELSE C.STOR_LEVEL_2 END, '-',
CASE WHEN C.STOR_LEVEL_3 like '[0-9]'
THEN '0' + C.STOR_LEVEL_3
WHEN C.STOR_LEVEL_3 = '' THEN '00'
ELSE C.STOR_LEVEL_3 END, '-',
CASE WHEN C.STOR_LEVEL_4 like '[0-9]'
THEN '0' + C.STOR_LEVEL_4
WHEN C.STOR_LEVEL_4 = '' THEN '00'
ELSE C.STOR_LEVEL_4 END ) ) END
FROM MyTable A
LEFT OUTER JOIN OtherTable C ON C.INV_ITEM_ID = A.INV_ITEM_ID
有没有一种不用在这里使用子查询就可以实现的方法?
如果左连接中没有匹配项,OtherTable
值将是 null
而不是 ''
所以当你这样说时:
CASE WHEN C.INV_ITEM_ID '' THEN '00-00-00-00-00'
您正在检查 c.INV_ITEM_ID
字段中是否存在长度为零的字符串或 ''
你应该使用
CASE WHEN C.INV_ITEM_ID is null THEN '00-00-00-00-00'
您可能没有任何具有字符串值 ''
的 c.INV_ITEM_ID
。因此,当左连接中没有匹配数据(即值为空)时,case 表达式继续执行连接。每个子案例表达式都会检查 c.STOR_LEVEL_1
并且没有匹配项,因此使用“else”或 C.STOR_LEVEL_1
。所以你实际拥有的是
concat(null,'-',null,'-',null,'-',null,'-')
计算结果为 ----
或许可以将您的 SQL 缩减一点:
SELECT
A.INV_ITEM_ID,
CONCAT(
RIGHT(CONCAT('00', C.STOR_LEVEL_1), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_2), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_3), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_4), 2)
) as x
CONCAT 的行为与带有 NULL 的 + 略有不同。 CONCAT 将 null 视为空字符串,但 + 将使整个表达式无效。这个,无论你的列是空的,一位数还是两位数,如果你将它连接到'00'然后取最右边的2你最终得到一个2位数字(如果为空则为00,如果为一位则为0x,如果为2则为xx) .
我试图用外部 CASE
语句包装下面的内部 CASE
语句,如果在左连接 OtherTable C
,相反,当在 OtherTable C
中找不到行时,它正在输出 ----
(只是破折号)。
SELECT A.INV_ITEM_ID,
CASE WHEN C.INV_ITEM_ID '' THEN '00-00-00-00-00'
ELSE ( CONCAT(CASE WHEN C.STORAGE_AREA like '[0-9]'
THEN '0'+ C.STORAGE_AREA
WHEN C.STORAGE_AREA = '' THEN '00'
ELSE C.STORAGE_AREA END ,'-', CASE WHEN C.STOR_LEVEL_1 like '[0-9]'
THEN '0' + C.STOR_LEVEL_1
WHEN C.STOR_LEVEL_1 = '' THEN '00'
ELSE C.STOR_LEVEL_1 END , '-',
CASE WHEN C.STOR_LEVEL_2 like '[0-9]'
THEN '0' + C.STOR_LEVEL_2
WHEN C.STOR_LEVEL_2 = '' THEN '00'
ELSE C.STOR_LEVEL_2 END, '-',
CASE WHEN C.STOR_LEVEL_3 like '[0-9]'
THEN '0' + C.STOR_LEVEL_3
WHEN C.STOR_LEVEL_3 = '' THEN '00'
ELSE C.STOR_LEVEL_3 END, '-',
CASE WHEN C.STOR_LEVEL_4 like '[0-9]'
THEN '0' + C.STOR_LEVEL_4
WHEN C.STOR_LEVEL_4 = '' THEN '00'
ELSE C.STOR_LEVEL_4 END ) ) END
FROM MyTable A
LEFT OUTER JOIN OtherTable C ON C.INV_ITEM_ID = A.INV_ITEM_ID
有没有一种不用在这里使用子查询就可以实现的方法?
如果左连接中没有匹配项,OtherTable
值将是 null
而不是 ''
所以当你这样说时:
CASE WHEN C.INV_ITEM_ID '' THEN '00-00-00-00-00'
您正在检查 c.INV_ITEM_ID
''
你应该使用
CASE WHEN C.INV_ITEM_ID is null THEN '00-00-00-00-00'
您可能没有任何具有字符串值 ''
的 c.INV_ITEM_ID
。因此,当左连接中没有匹配数据(即值为空)时,case 表达式继续执行连接。每个子案例表达式都会检查 c.STOR_LEVEL_1
并且没有匹配项,因此使用“else”或 C.STOR_LEVEL_1
。所以你实际拥有的是
concat(null,'-',null,'-',null,'-',null,'-')
计算结果为 ----
或许可以将您的 SQL 缩减一点:
SELECT
A.INV_ITEM_ID,
CONCAT(
RIGHT(CONCAT('00', C.STOR_LEVEL_1), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_2), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_3), 2), '-',
RIGHT(CONCAT('00', C.STOR_LEVEL_4), 2)
) as x
CONCAT 的行为与带有 NULL 的 + 略有不同。 CONCAT 将 null 视为空字符串,但 + 将使整个表达式无效。这个,无论你的列是空的,一位数还是两位数,如果你将它连接到'00'然后取最右边的2你最终得到一个2位数字(如果为空则为00,如果为一位则为0x,如果为2则为xx) .