-1

我想从给定的字符串中提取特定的整数值,例如

http://start.mysearchdial.com/results.php?q=hovercrafting+manchester&category=web&a=coolmsd&f=2&cd=2&XzuyEtN2Y1L1QzuyEzzyD0&cr=1818627175&uref=14&start=1

从上面的字符串中,我想从字符串的 'cd=2' 部分中提取 '2' 。我正在使用的代码是

DECLARE @URL VARCHAR(4000) 
SET @URL = 'http://start.mysearchdial.com/results.php?q=hovercrafting+manchester&category=web&a=coolmsd&f=2&cd=2&XzuyEtN2Y1L1QzuyEzzyD0&cr=1818627175&uref=14&start=1'
SELECT Case WHEN CHARINDEX('cd=',@URL)>0 
    THEN SUBSTRING(SUBSTRING(@URL,CHARINDEX('cd=',@URL),CHARINDEX('cd=',@URL)-1),4,CHARINDEX('&',SUBSTRING(@URL,CHARINDEX('cd=',@URL),CHARINDEX('cd=',@URL)-1))-4) 
    ELSE NULL 
END

现在只要 '&' 出现在整数部分之后,它就可以正常工作。有时没有“&”符号,然后这会给出异常。

有人可以帮忙处理这种情况吗?

4

3 回答 3

2

我会这样做来提取文本:

DECLARE @URL VARCHAR(4000) 
SET @URL = 'http://start.mysearchdial.com/results.php?q=hovercrafting+manchester&category=web&a=coolmsd&f=2&cd=2&XzuyEtN2Y1L1QzuyEzzyD0&cr=1818627175&uref=14&start=1'

DECLARE @QSXML xml
SET @QSXML = CAST('<a><b>' + REPLACE(SUBSTRING(@URL,CHARINDEX('?',@URL)+1,4000),'&','</b><b>') + '</b></a>' as xml)

select
    SUBSTRING(c.value('.','varchar(4000)'),4,4000)
from @QSXML.nodes('/a/b') t(c)
where
    c.value('.','varchar(4000)') like 'cd=%'

我这样做的原因是如果我需要从查询字符串中提取多个值 - 最终SELECT可以切换以生成键和值表。(我早就这样做了,但XzuyEtN2Y1L1QzuyEzzyD0参数没有值,我无法决定如何处理它)。


@QSXML这是给出表格结果的替代查询(仍按上述方式使用):

;With ShreddedNodes as (
    select
        c.value('.','varchar(4000)') as ParmAndValue
    from @QSXML.nodes('/a/b') t(c)
), Splits as (
    select ParmAndValue,CHARINDEX('=',ParmAndValue) as Split
    from ShreddedNodes
), KeysAndValues as (
    select
        CASE WHEN Split > 0
            THEN SUBSTRING(ParmAndValue,1,Split-1)
        ELSE
            ParmAndValue
        END as [Key],
        CASE WHEN Split > 0
            THEN SUBSTRING(ParmAndValue,Split+1,4000)
        END as Value
    from Splits
)
select * from KeysAndValues

产生:

Key                                Value
---------------------------------- --------------------------------------------------
q                                  hovercrafting+manchester
category                           web
a                                  coolmsd
f                                  2
cd                                 2
XzuyEtN2Y1L1QzuyEzzyD0             NULL
cr                                 1818627175
uref                               14
start                              1
于 2013-08-06T06:55:25.757 回答
0

试试这个:

DECLARE @URL VARCHAR(4000) 

SET @URL = 
'http://start.mysearchdial.com/results.php?q=hovercrafting+manchester&category=web&a=coolmsd&f=2&XzuyEtN2Y1L1QzuyEzzyD0&cr=1818627175&uref=14&start=1&cd=2'

SELECT CASE 
         WHEN Charindex('cd=', @URL) > 0 THEN 
           CASE 
             WHEN Charindex('&', @URL, Charindex('cd=', @URL) + 3) > 0 THEN 
             Substring(@URl, Charindex('cd=', @URL) + 3, Charindex('&', @URL, 
           Charindex('cd=', 
           @URL) + 3) - Charindex('cd=', @URL) - 3) 
             ELSE Substring(@URL, Charindex('cd=', @URL) + 3, 
                         Len(@URL) - Charindex('cd=', @URL) + 3) 
           END 
         ELSE NULL 
       END 

go 
于 2013-08-06T06:40:53.703 回答
0

在每种情况下,您都可以尝试在 url 上附加“&”(使用 CONCAT 或您的数据库系统需要的内容)

DECLARE @URL VARCHAR(4000) 
SET @URL = 'http://start.mysearchdial.com/results.php?q=hovercrafting+manchester&category=web&a=coolmsd&f=2&cd=2&XzuyEtN2Y1L1QzuyEzzyD0&cr=1818627175&uref=14&start=1'
SELECT Case WHEN CHARINDEX('cd=',@URL)>0 
    THEN SUBSTRING(SUBSTRING(CONCAT(@URL, '&'),CHARINDEX('cd=',CONCAT(@URL, '&')),CHARINDEX('cd=',CONCAT(@URL, '&'))-1),4,CHARINDEX('&',SUBSTRING(CONCAT(@URL, '&'),CHARINDEX('cd=',CONCAT(@URL, '&')),CHARINDEX('cd=',CONCAT(@URL, '&'))-1))-4) 
    ELSE NULL 
END
于 2013-08-06T06:55:02.420 回答