sql查询,子字符串问题

时间:2011-10-11 13:23:28

标签: asp.net sql sql-server sql-server-2005 sql-server-2008

我有一个小问题要问

我在数据库列中有以下数据。

isLoggedIn = False& CurrentReferral = http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath = / abc.aspx& kw =& FirstVisitDate = 10/10/2011 6:52:38 AM& FirstReferral = http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare&ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspx& UserTotalVisits = 2& ContactId = 819& tenantChannelName = Ufone GSM channel& tenantChannelUrl = http://ufone.testSite.tv/& mcid =& ASP.NET_SessionId = ksntwa55yh3u3s45xn5rysyj& IsVisitTracked = yes

我需要做的只是从那里得到'ExternalReferrer', 喜欢

  

ExternalReferrer = HTTP://www.testSite.tv/CustomerCare.aspx链路= CustomerCare,HTTP://testSite.tv/Signin.aspx& UserTotalVisits = 2及的ContactID = 819&安培; tenantChannelName =商Ufone   GSM频道& tenantChannelUrl = http://ufone.testSite.tv/

我尝试了子字符串,但没有得到那个

declare @myData nvarchar (1000)
set @myData= 'isLoggedIn=False&CurrentReferral=http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath=/abc.aspx&kw=&FirstVisitDate=10/10/2011 6:52:38 AM&FirstReferral=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare&ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspx&UserTotalVisits=2&ContactId=819&tenantChannelName=Ufone GSM channel&tenantChannelUrl=http://ufone.testSite.tv/&mcid=&ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyj&IsVisitTracked=yes'



SELECT  SUBSTRING(@myData, CHARINDEX ('ExternalReferrer' ,@myData ), CHARINDEX ('mcid' ,@myData )) AS Initial 

使用sql 2008

3 个答案:

答案 0 :(得分:1)

SUBSTRING的第三个参数是要返回的字符串的长度,因此您必须从&mcid的位置减去external的位置:

select 
    substring
    (
        @mydata, 
        charindex('external', @mydata), 
        charindex('&mcid', @mydata) - charindex('external', @mydata)
    )

编辑:

您在运行我的SQL语句的数据是什么? 我使用了你问题中的MyData声明。

这段代码在我的SQL Server Management Studio 2008中的计算机上运行,​​并返回所需的输出,如您的问题所示:

declare @myData nvarchar (1000)
set @myData= 'isLoggedIn=False&CurrentReferral=http://ufone.testSite.tv/Messaging.aspx?aspxerrorpath=/abc.aspx&kw=&FirstVisitDate=10/10/2011 6:52:38 AM&FirstReferral=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare&ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=CustomerCare,http://testSite.tv/Signin.aspx&UserTotalVisits=2&ContactId=819&tenantChannelName=Ufone GSM channel&tenantChannelUrl=http://ufone.testSite.tv/&mcid=&ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyj&IsVisitTracked=yes'

select 
    substring
    (
        @mydata, 
        charindex('external', @mydata), 
        charindex('&mcid', @mydata) - charindex('external', @mydata)
    )

编辑2:

SUBSTRING的第二个参数指定返回字符的起始位置 在我的第一个答案中,由于charindex(...),这是“ExternalReferrer =”的第一个字符。

如果要从结果中省略“ExternalReferrer =”,则只需将此字符串的长度添加到第二个SUBSTRING参数,以便返回的字符串在后直接开始>“ExternalReferrer =”:

select 
    substring
    (
        @mydata, 
        charindex('external', @mydata) + len('externalreferrer='), 
        charindex('&mcid', @mydata) - charindex('external', @mydata)
    )

编辑3:

我的错误。
在我的上一次编辑中,我将返回字符的起始位置移动到右侧 但是我没有改变返回字符串的长度,所以当然结束位置也向右移动(这就是为什么再次返回&mcid=的东西)
解决方案不仅是将“ExternalReferrer =”的长度添加到起始位置,还要将其从结束位置中减去:

select 
    substring
    (
        @mydata, 
        charindex('external', @mydata) + len('externalreferrer='), 
        charindex('&mcid', @mydata) - charindex('external', @mydata) - len('externalreferrer=')
    )

答案 1 :(得分:1)

我相信这就是你想要的:

SELECT SUBSTRING(@myData, PATINDEX('%ExternalReferrer%' ,@myData ), PATINDEX('%mcid%' ,@myData ) - PATINDEX('%ExternalReferrer%' ,@myData ) - 1) AS Initial  

但是对于该字符串非常具体,所以如果你的网址中有另一个'mcid'字符串,你需要小心。

答案 2 :(得分:1)

如果您知道每次mcid将在ExternalReferrer之后出现,请尝试在asp.net代码中运行此正则表达式:

/ExternalReferrer=(.*)&mcid/

匹配组$1将为您提供您正在寻找的价值。