【发布时间】: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中的AND和OR组合。无论如何,您不需要在那里检查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