【问题标题】:Case statement not returning null when expectedCase 语句在预期时未返回 null
【发布时间】:2020-11-25 13:08:15
【问题描述】:

我有一个案例语句,它使用逻辑来删除订单号。但是我无法弄清楚为什么返回某些值而不是 null

t3.LMS_SalesOrder_ExternalRef t3,
t2.LMS_SalesOrder_ExternalRef t2,
                case
                    when        t3.LMS_SalesOrder_ExternalRef IS NOT NULL 
                    and         t3.LMS_SalesOrder_ExternalRef LIKE '%-%' or t3.LMS_SalesOrder_ExternalRef LIKE '%_%' 
                        then    
                            case    when t3.LMS_SalesOrder_ExternalRef LIKE '%-%' 
                                        then LEFT(t3.LMS_SalesOrder_ExternalRef, charindex('-', t3.LMS_SalesOrder_ExternalRef) - 2) 
                                    when t3.LMS_SalesOrder_ExternalRef LIKE '%_%' 
                                        then LEFT(t3.LMS_SalesOrder_ExternalRef, charindex('_', t3.LMS_SalesOrder_ExternalRef) - 2) 
                            end
                    when        t2.LMS_SalesOrder_ExternalRef LIKE '%-%' 
                    and         ASCII(LEFT(t2.LMS_SalesOrder_ExternalRef, charindex('-', t2.LMS_SalesOrder_ExternalRef)) ) BETWEEN 48 AND 57 
                        then        replace(LEFT(t2.LMS_SalesOrder_ExternalRef, charindex('-', t2.LMS_SalesOrder_ExternalRef) - 1), '-', '')
                    when        t2.LMS_SalesOrder_ExternalRef LIKE '%_%'
                        then        SUBSTRING(t2.LMS_SalesOrder_ExternalRef, CHARINDEX('_',t2.LMS_SalesOrder_ExternalRef) + 1, LEN(t2.LMS_SalesOrder_ExternalRef))
                    else        null
                end                                                                                     as omOrder

所以当t3不为空时,拉出右边的7位数字

当 t3 为空时,从 t2 中提取 7 位数字

为什么 else null 不处理结果的第 3 行中的值?在这种情况下,omOrder 应该为空。

当 t3 为 null 且 t2 不包含 _ 或 - 时,如何为 omOrder 获取 null,如结果的第 3 行所示

该逻辑还处理 t2 和 t3 中的值用 - 分隔的情况

【问题讨论】:

  • 请解释你要实现的逻辑——可能有更简单的方法。
  • 你有一个CASE 表达式。 T-SQL 不支持Case (Switch) 语句,仅支持CASE 表达式。前者只能返回一个标量值;它不像逻辑流运算符那样操作,也不提供布尔结果。
  • 我敢打赌,因为第一个 WHEN 中的 ANDOR 组合。无论如何,您不需要在那里检查NULL。如果您确实需要NULL 检查,请使用括号:t3.LMS_SalesOrder_ExternalRef IS NOT NULL AND (t3.LMS_SalesOrder_ExternalRef LIKE '%-%' OR t3.LMS_SalesOrder_ExternalRef LIKE '%_%')
  • @GordonLinoff 请查看新的 cmets

标签: sql sql-server


【解决方案1】:

如果这是你想要的逻辑:

所以当t3不为空时,拉出右边的7位数字

当 t3 为空时,从 t2 中提取 7 位数字

那么逻辑是:

select coalesce(right(t3.LMS_SalesOrder_ExternalRef, 7),
                right(t2.LMS_SalesOrder_ExternalRef, 7)
               )

如果您需要验证确实存在 7 位数字,则可以使用 case

select (case when t3.LMS_SalesOrder_ExternalRef like '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
             then right(t3.LMS_SalesOrder_ExternalRef, 7)
             when t2.LMS_SalesOrder_ExternalRef like '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
             then right(t2.LMS_SalesOrder_ExternalRef, 7)
        end)

【讨论】:

  • 当 t3 或 t2 包含 - 而不是 _ 时,值会颠倒,例如 JDS71818_4938216 或 4938216-JDS71818
  • 当 t3 为空且 t2 不包含 _ 或 - 如结果的第 3 行所示时,如何为 omOrder 获取空值?
猜你喜欢
  • 2015-11-19
  • 2022-10-13
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多