通过SQL(SSMS)中的LIKE运算符传递列表

时间:2018-08-13 20:25:26

标签: sql sql-server

我有一张公司信息表(名称,总部国家/地区,等等)和国家名称列表。

我想查看哪些公司的名称中包含国家/地区名称,但总部不在该国家/地区。

我有一个简单的SQL查询,一次可以执行一次,但是我想编写一个查询,使所有国家/地区都能通过。

现在,我的where子句实际上看起来像

WHERE company LIKE '%CANADA%'
  AND hq_country_full != 'CANADA'

我也尝试使用子查询,但无法弄清楚这一点。我在想我可能需要使用局部变量,但不确定如何设置它。任何帮助,将不胜感激!

3 个答案:

答案 0 :(得分:2)

也许是这样?

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)而不是左联接,因为从理论上讲,一家公司可以满足您为多个国家/地区描述的标准,所以我认为您只想在这种情况下一次出现在结果集中的国家/地区。如果要在这种情况下获得多个结果,请改用左联接。

答案 1 :(得分:1)

您可以将带有国家名称的列表放在表中。甚至可以是#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

答案 2 :(得分:0)

由于您拥有hq_country_full列,因此您可以在LIKE子句中使用它:

WHERE company NOT LIKE '%' + hq_country_full + '%'