在 SQL (SSMS) 中通过 LIKE 运算符传递列表
Posted
技术标签:
【中文标题】在 SQL (SSMS) 中通过 LIKE 运算符传递列表【英文标题】:Passing a list through a LIKE operator in SQL (SSMS) 【发布时间】:2018-08-13 20:25:25 【问题描述】:我有一张公司信息表(名称、总部所在国家/地区等)和国家/地区名称列表。
我想查看哪些公司的公司名称中有国家/地区名称,但总部不在该国家/地区。
我有一个简单的 SQL 查询,一次只做一个,但我想编写一个让所有国家/地区通过的查询。
现在我的 where 子句实际上看起来像
WHERE company LIKE '%CANADA%'
AND hq_country_full != 'CANADA'
我也尝试过使用子查询,但无法弄清楚这一点。我在想我可能需要使用局部变量,但不知道如何设置它。任何帮助,将不胜感激!
【问题讨论】:
为什么不在这两个表上使用左连接呢? 您的“国名列表”是单独的表格吗? 啊,您正在寻找不在意大利的 VITALY SHOES 和不在法国的 FRANCESCO'S STORE。祝你好运:-) 【参考方案1】:大概是这样的吧?
declare @Company table (company varchar(128), hq_country_full varchar(128));
insert @Company values
('Canada Company', 'Canada'),
('Non-Canada Company', 'Mexico'),
('Mexico Company', 'Mexico'),
('Non-Mexico Company', 'Canada');
declare @Country table (country varchar(128));
insert @Country values
('Canada'),
('Mexico');
select
Company.*
from
@Company Company
where
exists (select 1 from @Country Country where
Company.hq_country_full != Country.country and
Company.company like '%' + Country.country + '%');
结果:
company hq_country_full
Non-Canada Company Mexico
Non-Mexico Company Canada
我选择了半联接 (exists
) 而不是左联接,因为从理论上讲,一家公司有可能满足您为多个国家/地区描述的标准,而我认为您只想要该国家/地区在这种情况下出现在结果集中一次。如果在这种情况下您想要多个结果,请改用左连接。
【讨论】:
嘿,这看起来很有希望!我不熟悉这种类型的 sql,但我假设您可以为插入运行选择,这样我就不必手动输入 8000 万行以上?我想我找到了解决方案,但我对这种方法很感兴趣,因为我的方法不是 100% 密封的 @EthanE - 我的DECLARE
和INSERT
语句的目的只是设置一些示例数据,因为我没有您的原始表可以使用。假设这些数据已经在您的数据库中某处,您根本不需要它们。只需使用类似于我的SELECT
的名称,将@Country
和@Company
替换为您的实际表名。【参考方案2】:
您可以将该列表与国家/地区名称放在一个表格中。这甚至可以是#temporary 表或@table 变量。
之后,您可以使用 LIKE 将公司信息表加入国家/地区名称表。
-- Using a table variable for the example
declare @countrynames table (name varchar(80) primary key);
insert into @countrynames (name) values
('CANADA')
,('BELGIUM')
,('RUSSIA')
,('USA');
SELECT
comp.company,
comp.hq_country_full
ctry.name as countryName
FROM companyinfo comp
JOIN @countrynames as ctry
ON comp.company LIKE '%'+ctry.name+'%'
WHERE comp.hq_country_full != ctry.name
【讨论】:
【参考方案3】:好像你有一个 hq_country_full 列,你可以在 LIKE 子句中使用它:
WHERE company NOT LIKE '%' + hq_country_full + '%'
【讨论】:
以上是关于在 SQL (SSMS) 中通过 LIKE 运算符传递列表的主要内容,如果未能解决你的问题,请参考以下文章
当“LIKE”子句包含参数时,SQL Server 不使用索引