【问题标题】:Find and replace by pattern按模式查找和替换
【发布时间】:2021-11-17 11:14:32
【问题描述】:

我有一个表格,其中有一列如下所示

url
----------------
dir=mp3\cat152AB&fileName=file-01.mp3
dir=mp3\cat2500DfDD00&fileName=file-02.mp3
dir=mp3\cat4500f0655&fileName=file-03.mp3
...

如何在 SQL Server 中删除多余的字符串并按如下方式排列字段。

url
----------------
file-01
file-02
file-03
...

【问题讨论】:

标签: sql sql-server tsql replace


【解决方案1】:

你可以使用 charindex 和 substring :

SELECT substring ('dir=mp3\cat152AB&fileName=file-01.mp3', CHARINDEX('fileName=', 'dir=mp3\cat152AB&fileName=file-01.mp3') +9 ,  
 LEN('dir=mp3\cat152AB&fileName=file-01.mp3')-CHARINDEX('fileName=', 'dir=mp3\cat152AB&fileName=file-01.mp3') 
) AS MatchPosition;

【讨论】:

  • 当然如果你使用cross apply你可以避免多次重复同样的计算。
  • 恕我直言,接受答案的选择非常糟糕。
【解决方案2】:

CHARINDEXSUBSTRING可以帮到你,请查看示例:

select substring (field, charindex (';fileName=', field) + len (';fileName='), len (field) - len ('.mp3') + 1 - charindex (';fileName=', field) - len (';fileName='))
from (
select 'dir=mp3\cat152AB&fileName=file-01.mp3' field union all
select 'dir=mp3\cat2500DfDD00&fileName=file-02.mp3' union all
select 'dir=mp3\cat4500f0655&fileName=file-03.mp3'
) a

【讨论】:

  • 当然如果你使用cross apply你可以避免多次重复同样的计算。
【解决方案3】:

您想要的信息似乎总是字符串结尾之前的第 11 到第 5 个字符。我建议一个简单的解决方案:

select left(right(url, 11), 7)

Here 是一个 dbfiddle。

【讨论】:

    【解决方案4】:

    请尝试以下方法。

    它通过 XML/XQuery 使用标记化。

    SQL

    -- DDL and sample data population, start
    DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, url VARCHAR(255));
    INSERT INTO @tbl (url) VALUES
    ('dir=mp3\cat152AB&fileName=file-01.mp3'),
    ('dir=mp3\cat2500DfDD00&fileName=file-02.mp3'),
    ('dir=mp3\cat4500f0655&fileName=file-03.mp3');
    -- DDL and sample data population, end
    
    DECLARE @separator CHAR(1) = '=';
    
    SELECT id, url
        , LEFT(x, CHARINDEX('.', x) - 1) AS Result
    FROM @tbl
        CROSS APPLY (SELECT CAST('<root><r><![CDATA[' + 
                REPLACE(url, @separator, ']]></r><r><![CDATA[') + 
                ']]></r></root>' AS XML)) AS t1(c)
        CROSS APPLY (VALUES (c.value('(/root/r[last()]/text())[1]', 'VARCHAR(100)'))) AS t2(x);
    

    输出

    +----+------------------------------------------------+---------+
    | id |                      url                       | Result  |
    +----+------------------------------------------------+---------+
    |  1 | dir=mp3\cat152AB&amp;fileName=file-01.mp3      | file-01 |
    |  2 | dir=mp3\cat2500DfDD00&amp;fileName=file-02.mp3 | file-02 |
    |  3 | dir=mp3\cat4500f0655&amp;fileName=file-03.mp3  | file-03 |
    +----+------------------------------------------------+---------+
    

    【讨论】:

      【解决方案5】:

      我知道我们有一个公认的答案,但我想加入另一个简单、高性能的解决方案,该解决方案可以处理各种长度的文件名和文件扩展名。为了好玩,我添加了一个参数,如果您愿意,可以包含文件扩展名。

      --==== Easily Consumable Sample Data
      DECLARE @link TABLE ([url] VARCHAR(100) UNIQUE);
      INSERT  @link VALUES ('dir=mp3\cat152AB&amp;fileName=file-01.mp3'),
                           ('dir=mp3\cat2500DfDD00&amp;fileName=file-02.mp3'),
                           ('dir=mp3\cat4500f0655&amp;fileName=file-03.mp3'),
                           ('dir=mp3\cat4500f0655&amp;fileName=file-999.mp3'),
                           ('dir=mp3\cat4500d9997&amp;fileName=file-0021.prodigi');
      
      --==== Allows you to determine if you want the file extension
      DECLARE @exclude BIT=1;
      
      SELECT      l.[url], TheFile = SUBSTRING(l.[url], s.Pos, s.Ln-s.Pos- ((@exclude*(fl.Ln)-1)))
      FROM        @link AS l
      CROSS APPLY (VALUES(CHARINDEX('.',REVERSE(l.[url])))) AS fl(Ln)
      CROSS APPLY (VALUES(CHARINDEX('fileName=',l.[url])+9, LEN(l.[url]))) AS s(Pos,Ln);
      

      @exclude=1 返回:

      url                                                   TheFile
      ----------------------------------------------------- --------------
      dir=mp3\cat152AB&amp;fileName=file-01.mp3             file-01
      dir=mp3\cat2500DfDD00&amp;fileName=file-02.mp3        file-02
      dir=mp3\cat4500d9997&amp;fileName=file-0021.prodigi   file-0021
      dir=mp3\cat4500f0655&amp;fileName=file-03.mp3         file-03
      dir=mp3\cat4500f0655&amp;fileName=file-999.mp3        file-999
      

      @exclude=0 返回:

      url                                                   TheFile
      ----------------------------------------------------- --------------
      dir=mp3\cat152AB&amp;fileName=file-01.mp3             file-01.mp3
      dir=mp3\cat2500DfDD00&amp;fileName=file-02.mp3        file-02.mp3
      dir=mp3\cat4500d9997&amp;fileName=file-0021.prodigi   file-0021.prodigi
      dir=mp3\cat4500f0655&amp;fileName=file-03.mp3         file-03.mp3
      dir=mp3\cat4500f0655&amp;fileName=file-999.mp3        file-999.mp3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 2014-09-30
        • 2015-01-10
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        相关资源
        最近更新 更多