为什么这个 CASE 没有按预期执行?

Why does this CASE not do as expected?

此查询未能按预期执行。这是我的示例代码:

create table #test (last_name varchar(20), plan_name varchar(60))
insert #test values ('Alanis', 'Alanis UT Standard Bulk Cut (DRP)')

select last_name
    , plan_name
    , case when plan_name like '''' + last_name + '%''' then SUBSTRING(plan_name, len(ltrim(rtrim(last_name)))+1, len(ltrim(rtrim(last_name)))+25) else isnull(plan_name, 'NA') end
from #test

现在我希望这样做的是,如果 plan_namelast_name 开头,则去掉前面的部分,这样我就剩下 [=12= 的文本了] 减去前缀 last_name。但由于某种原因,这不起作用。它只是吐出 plan_name,根本没有任何变化。

如果我更明确地编码,它工作得很好:

select last_name
    , plan_name
    , case when plan_name like 'alanis%' then SUBSTRING(plan_name, len(ltrim(rtrim(last_name)))+1, len(ltrim(rtrim(last_name)))+25) else isnull(plan_name, 'NA') end
from #test

我什至尝试使用 QUOTENAME() 函数而不是手动连接,但我得到了相同的结果。我验证了我的来源 table 的列实际上是 varchar 数据类型(对于 last_nameprice_plan)。我假设我遗漏了一些细节,但我不知道它是什么。

last_name 在单引号内,删除那些多余的引号即可。

select last_name
    , plan_name
    , case when plan_name like '' + last_name + '%' then SUBSTRING(plan_name
        , len(ltrim(rtrim(last_name)))+1, len(ltrim(rtrim(last_name)))+25) else isnull(plan_name, 'NA') end
from #test

另一个建议是使用 sql replace 函数代替 substring

select last_name
    , plan_name
    , case when plan_name like '' + last_name + '%' then replace(plan_name, last_name, '') else isnull(plan_name, 'NA') end
from #test