按模式查找和替换

Find and replace by pattern

我有一个 table 有一个像下面这样的列

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

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

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

你可以使用 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;

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

你要的信息好像总是字符串结尾前的第11到第5个字符。我建议一个简单的解决方案:

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

Here 是一个 db<>fiddle.

请尝试以下方法

它正在通过 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&amp;fileName=file-01.mp3'),
('dir=mp3\cat2500DfDD00&amp;fileName=file-02.mp3'),
('dir=mp3\cat4500f0655&amp;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 |
+----+------------------------------------------------+---------+

我知道我们有一个可以接受的答案,但我想提出另一个简单、高性能的解决方案来解决不同长度的文件名和文件扩展名。为了好玩,我添加了一个参数,允许您选择包含文件扩展名。

--==== 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 returns:

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 returns:

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