如何删除字符串中的未知字符?

时间:2015-04-26 10:43:18

标签: sql-server-2008

我想删除string的部分内容。

我们有一个表:地点

mk-MK=New York; sq-AL=Nej York; en-US=New York

mk-MK=London; sq-AL=London; en-US=London

mk-MK=Paris; sq-AL=Paris; en-US=Paris

我想删除所有内容,只保留sq-AL=LocationName

我希望结果是:

sq-AL=Nej York;
sq-AL=London;

2 个答案:

答案 0 :(得分:1)

这是规范化数据库重要性的又一个例子 在标准化数据库中,您将拥有一个包含2列的表,一列用于文化(sq-Al,en-US etc`),另一列用于值。我会更进一步,将文化放在查找表中。

但是,由于情况并非如此,您必须使用字符串操作来获取特定文化的值。您可以使用SUBSTRING和CHARINDEX找到您想要的特定图案 这将适用于我列出的样本数据所代表的任何情况。

-- Create the table and insert sample data
CREATE TABLE Location ([Name] varchar(100))
INSERT INTO Location ([Name]) VALUES 
('en-US=Huston; mk-MK=Huston; sq-AL=Huston;'), -- end of the row, with the ending ';'.
('en-US=New York; mk-MK=New York; sq-AL=Nej York'), -- end of the row, without the ending ';'.
('mk-MK=London; sq-AL=London; en-US=London'),  -- middle of the row
('sq-AL=Paris; en-US=Paris; mk-MK=Paris') -- begining of the row



SELECT  SUBSTRING(Name, 
        CHARINDEX('sq-AL=', Name), -- index of 'sq-AL='
        CASE WHEN CHARINDEX(';', Name, CHARINDEX('sq-AL=', Name)) > 0 THEN -- If there is a ';' after 'sq-AL='.
            CHARINDEX(';', Name, CHARINDEX('sq-AL=', Name)) -- index of the first ';' after 'sq-AL=' 
            - CHARINDEX('sq-AL=', Name)  -- index of the first ';' - the index of 'sq-AL=' will give you the length for `Nej York`
        ELSE 
            LEN(Name) 
        END
    ) + ';'
FROM Location

-- Cleanup
DROP Table Location 

答案 1 :(得分:0)

您可以使用CHARINDEX功能。我已经尝试使用变量as,

declare @locations varchar(100) = 'mk-MK=New York; sq-AL=Nej York; en-US=New York'

select LEFT(
          RIGHT(
                 @locations, LEN(@locations)-CHARINDEX(';',@locations) 
                 --output here :  sq-AL=Nej York; en-US=New York
               )
             ,CHARINDEX(';',@locations)
           )  + ';'
--Final Output :  sq-AL=Nej York;

在您的情况下:查询将为,

select LEFT(
          RIGHT(
                 Name, LEN(Name)-CHARINDEX(';',Name) 
                 --output here :  sq-AL=Nej York; en-US=New York
               )
             ,CHARINDEX(';',Name)
           )  + ';' 
FROM Locations