2013-03-08 55 views
1

我需要搜索国家ID并遇到问题,例如,让我们带着国家“玻利维亚”。与正确的值和通配符百分比一样

国表里有“国家或地区名称”和“备用名称”

对于“玻利维亚”的例子。

IdCountry Name        Code AlternateNames 
---------- -------------------------------- ----- --------------------------- 
29   Bolivia, Plurinational State Of BO Bolivia, Bolivien, Bolivie 

这是我所创建的查询:

SELECT cou.CountryID 
FROM Doppler2011.dbo.Country cou 
WHERE (cou.AlternateNames IS NOT NULL AND 'Bolivia' like '%'+cou.AlternateNames+'%') 
     OR 'Bolivia' like cou.Name 

正如你看到的,我需要在类似的右侧cou.AlternateNames该国的名义与一些替代的匹配名称,对于名称与cou.Name相同的国家/地区,查询可行,但问题在于那些必须与备用名称匹配的国家/地区

任何人都可以帮我吗?

谢谢!

+0

“AlternateNames”是否作为列值存储在一起? – swasheck 2013-03-08 17:49:09

回答

3

您应该对其他条款的wilcards这样

SELECT cou.CountryID 
     FROM Doppler2011.dbo.Country cou 
     WHERE cou.AlternateName like '%Bolivia%' OR cou.Name like 'Bolivia' 
+1

+1和“IS NOT NULL”是多余的。 – 2013-03-08 17:42:12

+0

你说得对,我不知道为什么这个查询让我很困惑......谢谢! – 2013-03-08 17:43:20

+0

Aaron Bertrand你是对的,我会编辑。马里亚诺你不客气。 – Ateszki 2013-03-08 17:45:27

1

您的where子句基本上是倒退。 你通常会说:

COLUMN_NAME like '%string_to_match%' 
1

根据你的实际结构,这里有一些想法。

如果AlternateName被存储为一个值以逗号分隔的列表,Name总是在AlternateName列表中的第一个值,那么你可以使用Ateski's answer

如果它不是第一个项目在列表中,那么你需要关注@ AaronBertrand的意见,在他的评论:

SELECT cou.CountryID 
    FROM Doppler2011.dbo.Country cou 
    WHERE ',' + cou.AlternateName + ',' LIKE '%,Bolivia,%' 
     OR cou.Name ='Bolivia'; 

最后,如果你能重新工作,你的结构,让你有可能的国家名称的列表了一下,你能想出什么像这样:

http://sqlfiddle.com/#!3/6d3c8/1

只是一个替代的观点。 Ateski的解决方案是完全有效的。