在 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 - 我的DECLAREINSERT 语句的目的只是设置一些示例数据,因为我没有您的原始表可以使用。假设这些数据已经在您的数据库中某处,您根本不需要它们。只需使用类似于我的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 运算符传递列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SLICK 中使用 SQL“LIKE”运算符

当“LIKE”子句包含参数时,SQL Server 不使用索引

SQL学习——LIKE运算符

Hibernate Criteria API 中的 SQL 'LIKE' 运算符

在sql代码中使用Like运算符。语法错误

如何在带有 php 用户输入的 SQL 中使用 like 运算符? [复制]