从包含国家名称和它的缩写的字符串,如何只提取名称?

时间:2017-02-27 06:57:46

标签: sql sql-server tsql

例如在'GER Germany'或'IT Italy'中,我只需要国家名称'德国'或'意大利'。 我可以使用patindex然后使用子串吗?如果那时,我如何检查缩写?因为在DB中还有其他名称,例如“越南”,“埃及”等。它们应该按原样显示。

2 个答案:

答案 0 :(得分:0)

如果第二个字符大写,则检查可能就足够了:

DECLARE @dummy TABLE(Country VARCHAR(100));
INSERT INTO @dummy VALUES('IT Italy'),('GER Germany'),('Viet Nam');

SELECT Country
      ,CutOff.Abbr
      ,CutOff.CountryName
FROM @dummy 
CROSS APPLY(SELECT SUBSTRING(Country,1,CHARINDEX(' ',Country)-1) AS Abbr
                  ,SUBSTRING(Country,CHARINDEX(' ',Country)+1,9999) AS CountryName) AS CutOff
WHERE ASCII(SUBSTRING(CutOff.Abbr,2,1)) BETWEEN 65 AND 90

返回

Country     Abbr    CountryName
IT Italy    IT      Italy
GER Germany GER     Germany

更新

获取已解析名称的列表:

SELECT Country
      ,CASE WHEN ASCII(SUBSTRING(Country,2,9999)) BETWEEN 65 AND 90 THEN SUBSTRING(Country,CHARINDEX(' ',Country)+1,9999) ELSE Country END AS CountryName
FROM @dummy

返回

Country     CountryName
IT Italy    Italy
GER Germany Germany
Viet Nam    Viet Nam

更新2

您可以read this article查找如何使用PATINDEXCOLLATE Latin1_General_BIN建立联系以允许区分大小写的搜索模式。使用_CS_整理的显而易见的解决方案无法令人满意地使用字母范围......

答案 1 :(得分:0)

我建议您对数据进行规范化,并将信息分为两列。

这将解决所描述的问题。

DECLARE @t table(col varchar(50))
INSERT @t 
VALUES('Viet Nam'),('GER Germany'),('Italy')

SELECT
  CASE
    WHEN col like lft collate Latin1_General_BIN 
    THEN stuff(col,1, len(lft)-1,'')
    ELSE col
  END Country
FROM
  @t
CROSS APPLY
  (SELECT upper(LEFT(col, CHARINDEX(' ',col+' ')))+'%' lft) z

<强> Fiddle