例如在'GER Germany'或'IT Italy'中,我只需要国家名称'德国'或'意大利'。 我可以使用patindex然后使用子串吗?如果那时,我如何检查缩写?因为在DB中还有其他名称,例如“越南”,“埃及”等。它们应该按原样显示。
答案 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
您可以read this article查找如何使用PATINDEX
与COLLATE 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 强>