【问题标题】:String between 2 Strings2个字符串之间的字符串
【发布时间】:2016-11-25 08:50:10
【问题描述】:

我目前正在使用下面列出的函数来查找 2 个字符串之间的文本,我的问题是什么都没有找到它只是返回一个错误,我不会返回空格或 Null,任何人都可以就如何请改一下。?

CREATE FUNCTION [dbo].[udf_GetStringBetween2Strings] 
(
    @String varchar(max), 
    @FirstString varchar(256), 
    @SecondString varchar(256)
)
RETURNS VARCHAR(max) 
AS
BEGIN

    DECLARE @FirstPosition int,  @SecondPosition int
    SET @FirstPosition = CHARINDEX(@FirstString,@String) + LEN(@FirstString)
    SET @SecondPosition = CHARINDEX(@SecondString,@String) 
    RETURN (SELECT SUBSTRING(@String, @FirstPosition, @SecondPosition - @FirstPosition))

END

【问题讨论】:

  • 你的输入参数是什么,你的预期输出是什么
  • 嗨,Mansoor,我已经重新检查了该功能,但很遗憾,我最初创建时没有正确保存它,这导致了我原来的问题。虽然这已经解决了我最初遇到的问题,但我认为我会进一步调查它。例如,我的函数调用类似于 select dbo.udf_GetStringBetween2Strings('','','') 因为您可以看到我要查找的第一件事是字符串 这会返回“t_customer_id>”,因为第一个字符串不存在,所以我真的想要一个“未找到”。
  • 您检查了我的以下查询吗?它是否适合您的预期结果..?

标签: sql-server tsql stored-functions


【解决方案1】:

最直接的方法是检查 charindex 的结果(没有找到匹配时返回 0)。例如

DECLARE @FirstPosition int,  @SecondPosition int
SET @FirstPosition = CHARINDEX(@FirstString,@String) 
if @FirstPosition = 0 return 'Not found'
set @FirstPosition += LEN(@FirstString)
SET @SecondPosition = CHARINDEX(@SecondString,@String, @FirstPosition) 
if @SecondPosition = 0 return 'Not found'   
return SUBSTRING(@String, @FirstPosition, @SecondPosition - @FirstPosition)

【讨论】:

  • 感谢您的回复,当其中一个参数丢失但它们都在那里时,它不会选择它们之间的内容,它只是返回 Not Found
  • 刚刚对其进行了测试,它似乎可以工作,但是在将示例粘贴到 SO 和从 SO 粘贴示例时,它没有。它可能是整理或一些隐藏的字符。你能尝试一个新的(非粘贴的)例子吗?
  • 感谢您的回复,我刚刚尝试从头开始输入整个函数,但恐怕仍然会遇到同样的问题。
  • 感谢您的尝试,但您是否尝试输入示例输入?函数本身可以复制粘贴,但复制粘贴merchant 示例后出现问题。重新输入该输入为我解决了这个问题。还用select dbo.udf_GetStringBetween2Strings('<a>dfasfas</a>','<a>', '</a>') 之类的简单方法进行了测试,这似乎在复制/粘贴后也可以工作
  • 不幸的是,我什至尝试关闭并重新打开我的 sql server 会话,但遇到了同样的问题。
【解决方案2】:

试试这个

    CREATE FUNCTION [dbo].[udf_GetStringBetween2Strings] 
(
    @String varchar(max), 
    @FirstString varchar(256), 
    @SecondString varchar(256)
)
RETURNS VARCHAR(max) 
AS
BEGIN

    DECLARE @FirstSplit VARCHAR(100),@SecondSplit VARCHAR(100),@ReturnStr VARCHAR(100)
    SET @FirstSplit = SUBSTRING(@String,0,CHARINDEX(' ',@String))
    SET @String = SUBSTRING(@String,CHARINDEX(' ',@String)+1,LEN(@String))
    SET @SecondSplit = @String

    IF @FirstSplit = @FirstString
       SET @ReturnStr =  @FirstSplit
    ELSE IF @SecondSplit = REPLACE(@SecondString,'?','')
      SET @ReturnStr =  @SecondSplit
    ELSE 
      SET @ReturnStr = 'Not Found'    RETURN @ReturnStr END

【讨论】:

  • 嗨,Mansoor,抱歉耽搁了,我用我的示例和我在此处发布的示例尝试了您的代码,然后我回来了“??)我也用这个“select dbo”感到厌烦.udf_GetStringBetween2Strings('1','','‌​>')" and I get back ??>" 这里我应该看到 1,我会迟到this 为 Decimal 值,但由于当前结果,将数据类型 varchar 转换为 numeric 时出现错误,这是由于当前返回结果而导致的错误。感谢您的帮助
  • 我编辑了我的查询。替换 ??字段为空。现在检查我是否成功输出匹配的大小写和不匹配字符串的“未找到”结果
  • 嗨,Mansoor,恐怕我仍然得到与以前相同的返回值。
  • 你可以在这里发布你的查询和传递的参数
  • select dbo.udf_GetStringBetween2Strings('','','‌​>') 是我传递的内容,而 ??> 是运行时返回什么
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2015-02-18
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多