【问题标题】:How do I remove unknown characters in a string?如何删除字符串中的未知字符?
【发布时间】:2015-07-04 18:38:54
【问题描述】:

我想删除string 的部分内容。

我们有一张桌子:Locations

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;

【问题讨论】:

  • 字符串的列名是什么:mk-MK=New York; sq-AL=Nej York; en-US=Tetovo
  • 表名是“位置”。列是“名称”
  • 是MySql还是Sql-Server?
  • 我正在使用 Microsoft SQL
  • 考虑在查询中使用正则表达式 (REGEX),例如:How to regex in a sql query

标签: sql-server-2008


【解决方案1】:

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

但是,由于情况并非如此,因此您必须使用字符串操作来获取特定文化的值。您可以使用 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 

【讨论】:

  • 我想,现在你明白了要求:)
  • 很高兴为您提供帮助。你真的应该重新考虑你的桌子设计。
【解决方案2】:

您可以使用CHARINDEX 函数。我已经尝试过使用相同的变量,

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

【讨论】:

  • 这只有在sq-AL=% 总是只是字符串的第二部分的情况下才有效。像en-US=New York; mk-MK=New York; sq-AL=Nej York; 这样的字符串将返回mk-MK=New York
  • @Arif,试试这个解决方案,如果有帮助请告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多