从url字符串中提取整数值

时间:2013-08-06 06:19:21

标签: sql sql-server sql-server-2008

我想从给定的字符串中提取特定的整数值 e.g。

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

现在只要'&'就可以正常工作出现在整数部分之后。有时没有'&'签署,然后这给了例外。

有人可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

答案 2 :(得分:0)

你可以尝试附加'&amp;' (在每种情况下,使用CONCAT或您的DB-System需要的内容)

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