【问题标题】:Incorporate case statement in where clause在 where 子句中加入 case 语句
【发布时间】:2020-06-08 20:59:59
【问题描述】:

我的要求如下:我需要提取所有在表中名称相似的公司数据(名称中的前3个单词应该出现在中间,可以在中间)作为输入的公司名称。

我的查询对于名称超过 3 个单词的数据运行良好,但 对于小于或等于 3 个单词的数据失败

我不知道如何在 where 子句中加入条件。

我的查询如下

select regno,name from ereg 
where 
(name  like '%' +(
 SELECT SUBSTRING(name, 0, CHARINDEX(' ', name, CHARINDEX(' ', name, CHARINDEX(' ', name, 0)+1)+1)) matchingwrd
FROM ereg where regno='C2113-UPD01')+'%') 

脚本如下

CREATE TABLE ereg(
    regnoINT, name VARCHAR(50)
);

INSERT INTO ereg (regno,name)  
values 
('C2113-UPD01','future company Ltd'),  
('C2223-UPD01','MY future company Ltd Corp'),  
('C2113-UPD01','Prime Private Furnishings housing Ltd  '),  
('C26903-UPD01','My Prime Private Furnishings Service   '), 

例如,它对 regno='C2113-UPD01' 工作正常并提供输出 -->>'C26903-UPD01','My Prime Private Furnishings Service
但如果输入是 'C2113-UPD01' 我的查询失败并且无法获取 'C2223-UPD01' 公司数据

【问题讨论】:

  • 仅供参考,它是case expression 而不是case statement
  • 列“regno”被定义为int。你的价值观是char。你的例子有问题。
  • “前 3 个单词”是什么意思?至少你应该有一个排序标准。也许窗口函数会有所帮助?
  • 请提供样本数据想要的结果。

标签: sql sql-server


【解决方案1】:

您的表格数据插入脚本、数据和脚本似乎都不是取自工作版本。我必须清理所有东西。

我为获得这 3 个单词所做的是在名称前添加另一个空格: 你的问题仍然给我带来了麻烦。但这是我的做法

;With cted as
(
Select regno, name, 
    SUBSTRING(name + ' ', 0, CHARINDEX(' ', name + ' ', CHARINDEX(' ', name + ' ', CHARINDEX(' ', name + ' ', 0)+1)+1)) as ThreeWords 
from ereg 
)
Select c1.regno, c1.name, c2.regno, c2.name 
from cted c1
inner join cted c2 on c2.name like    '%' + c1.ThreeWords + '%' and c1.regno <> c2.regno
Where  c1.regno='C2213-UPD01' -- or c1.regno='C2113-UPD01'

这里是fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2021-03-14
    • 2020-03-26
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多