【问题标题】:Sql query, sub string issuesql查询,子字符串问题
【发布时间】:2011-12-05 07:38:15
【问题描述】:

我有个小问题要问

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

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 频道&tenantChannelUrl=http: //ufone.testSite.tv/&mcid=&ASP.NET_SessionId=ksntwa55yh3u3s45xn5rysyj&IsVisitTracked=yes

我需要做的只是从中获得“ExternalReferrer”, 喜欢

ExternalReferrer=http://www.testSite.tv/CustomerCare.aspx?link=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 

m 使用 sql 2008

【问题讨论】:

  • 您遇到什么错误 - 我复制并粘贴了您的代码,它运行良好
  • 它没有给出错误,但它没有返回所需的结果(请参阅问题中的“我需要做什么”部分)。

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


【解决方案1】:

SUBSTRING的第三个参数是要返回的字符串的长度,所以要从external的位置减去&mcid的位置:

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的第二个参数指定返回字符的起始位置。
在我的第一个答案中,这是“ExternalReferrer=”的第一个字符,因为charindex(...)

如果你想在结果中省略"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=')
    )

【讨论】:

  • 这是我得到的消息 537,级别 16,状态 2,行 2 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
  • 哇,它的工作原理,但我可以从最终结果中省略外部吗?
  • @mahisama:是的,请参阅我的答案(再次编辑)。如果我的回答有帮助,如果您接受它作为正确答案会很好(并对其进行投票,但您还不能这样做,您需要 15 个代表)。
  • 我也得到了这部分的结果.. &mcid=&ASP.NET_Se 我不想要
  • 这是我需要的最后一个。 =(
【解决方案2】:

我相信这就是你想要的:

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

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

【讨论】:

    【解决方案3】:

    如果您知道每次mcid 都会在ExternalReferrer 之后出现,那么请尝试在您的asp.net 代码中运行这个正则表达式:

    /ExternalReferrer=(.*)&mcid/
    

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

    【讨论】:

    • 这不是有效的 SQL 语句
    • 问题中提到的标签也包含asp.net,所以答案有可以在asp.net中执行的代码
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多