Sql server SQL Server正在提取两个字符之间的子字符串

Sql server SQL Server正在提取两个字符之间的子字符串,sql-server,string,sql-server-2008,Sql Server,String,Sql Server 2008,正在寻找在SQL Server(2008)中执行以下字符串操作的好方法: 给定如下字符串(URL): 我需要提取“page.aspx”。因此,规则是抓住正斜杠(“/”)的最后一个实例和问号(“?”)的第一个实例之间的文本 请务必注意,字符串中可能有零个或多个正斜杠和零个或多个问号。因此,以下是有效的输入: /page.aspx?variable=value page.aspx?variable=value /path/page.aspx page.aspx 这可能会起作用(或者可能有一些我没有

正在寻找在SQL Server(2008)中执行以下字符串操作的好方法:

给定如下字符串(URL):

我需要提取“page.aspx”。因此,规则是抓住正斜杠(“/”)的最后一个实例和问号(“?”)的第一个实例之间的文本

请务必注意,字符串中可能有零个或多个正斜杠和零个或多个问号。因此,以下是有效的输入:

/page.aspx?variable=value
page.aspx?variable=value
/path/page.aspx
page.aspx

这可能会起作用(或者可能有一些我没有测试过的小改动)。

这应该可以处理所有情况,包括缺少斜杠或问号:

DECLARE @TestData TABLE
(
    URL VARCHAR(500)
)

INSERT INTO @TestData(URL) VALUES ('/path/page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('/page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('/path/page.aspx')
INSERT INTO @TestData(URL) VALUES ('page.aspx')


SELECT
    URL,
    SUBSTRING(URL, 
        ISNULL(2 + LEN(URL) - NULLIF(CHARINDEX('/', REVERSE(URL)), 0), 0), 
        CASE CHARINDEX('?', URL) WHEN 0 THEN LEN(URL) + 1 ELSE CHARINDEX('?', URL) END - 
        ISNULL(2 + LEN(URL) - NULLIF(CHARINDEX('/', REVERSE(URL)), 0), 0)) AS Page
FROM
    @TestData

我知道这很古老,但这里有一个链接,指向Sql Server的优秀文本操作功能。
您需要
STREXTRACT()
函数。

列名“LEN”无效。
SELECT SUBSTRING(url, 
                 LEN - CHARINDEX(REVERSE(url), '/') - 1,
                 CHARINDEX(url, '?') - (LEN - CHARINDEX(REVERSE(url), '/'))
                )
DECLARE @TestData TABLE
(
    URL VARCHAR(500)
)

INSERT INTO @TestData(URL) VALUES ('/path/page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('/page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('page.aspx?variable=value')
INSERT INTO @TestData(URL) VALUES ('/path/page.aspx')
INSERT INTO @TestData(URL) VALUES ('page.aspx')


SELECT
    URL,
    SUBSTRING(URL, 
        ISNULL(2 + LEN(URL) - NULLIF(CHARINDEX('/', REVERSE(URL)), 0), 0), 
        CASE CHARINDEX('?', URL) WHEN 0 THEN LEN(URL) + 1 ELSE CHARINDEX('?', URL) END - 
        ISNULL(2 + LEN(URL) - NULLIF(CHARINDEX('/', REVERSE(URL)), 0), 0)) AS Page
FROM
    @TestData