连接 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) .