为什么这个CASE不像预期的那样?

  • 本文关键字:CASE sql sql-server case
  • 更新时间 :
  • 英文 :


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

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开头,去掉前面的部分,这样我就只剩下plan_name减去前缀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()函数代替我的手动连接,我得到相同的结果。我验证了源表的列实际上是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

另一个建议是使用sqlreplace函数代替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

相关内容

  • 没有找到相关文章

最新更新