4

我有一个包含如下字段的文本列(小样本,有很多变化):

INSERT INTO #retention1 VALUES ('hello Action=Refer non-action=non-refer')
INSERT INTO #retention1 VALUES ('bye Action=Follow non-action=non-refer')
INSERT INTO #retention1 VALUES ('hello non-action=non-refer Action=compare')

我需要在 "Action=" 示例 ANSWER 之后找到单词 : 条目 1: 参考条目 2: 关注条目 3: 比较

如果“Action=”之后的所有单词长度相同,那么我可以做到。不幸的是,所有变体的长度都是未知的。行动之后的词几乎总是不同的,不仅仅是上面的 3 个变体。

任何想法建议将不胜感激。

这是我用于“参考”示例的代码,仅适用于:

BEGIN
DECLARE @P_string nvarchar (100),
@P_variable    nvarchar (100)/*,
@P_return_null nvarchar(100) = 'Y'*/

set @p_string = 'hello Action=Refer non-action=non-refer'
set @p_variable = 'Action'

select substring(@p_string, charindex(upper(@P_variable),upper(@P_string)) +len(@p_variable)+1,5) as trying


END;
4

3 回答 3

0

您要查找的代码应首先查找字符串Action,然后查找该单词后的空格字符。之后,您就拥有了操作源字符串所需的一切。

这应该有效:

DECLARE 
  @P_string nvarchar (100),
  @P_variable nvarchar (100),
  @idx1 int,
  @idx2 int

SET @p_string = 'hello Action=Refer non-action=non-refer'
SET @p_variable = 'Action'

SELECT
  @idx1 = charindex(lower(@P_variable),lower(@P_string)) + len(@p_variable) + 1,
  @idx2 = charindex(lower(' '), @P_string, @idx1) 

SELECT @idx1, @idx2

SELECT SUBSTRING(
  @p_string, 
  @idx1,
  @idx2 - @idx1) as trying

编辑

在更彻底地审查了需求之后,我决定定制一个用于类似目的的 rCTE 结构。就这样吧。

CREATE TABLE #retention1 (
  ID int,
  txt nvarchar (100)
)
INSERT INTO #retention1 VALUES (1, 'hello Action=Refer non-action=non-refer')
INSERT INTO #retention1 VALUES (2, 'bye Action=Follow non-action=non-refer')
INSERT INTO #retention1 VALUES (3, 'hello non-action=non-refer Action=compare')

;WITH T AS (
  SELECT
    ID,
    Row = 0,
    StartIdx = CAST(0 as int),
    EndIdx = CAST(0 as int),
    Result = CAST('' as nvarchar(max))
  FROM #retention1
  UNION ALL
  SELECT
    r1.ID,
    Row + 1,
    StartIdx = CAST(newstartidx AS int),
    EndIdx = CAST(EndIdx + newendidx as int),
    Result = CAST(newtoken as nvarchar(max))
  FROM 
    T
    JOIN #retention1 r1
      ON r1.ID = T.ID
    CROSS APPLY(
      SELECT newstartidx = EndIdx + 1
    ) calc1
    CROSS APPLY(
      SELECT newtxt = substring(r1.txt, newstartidx, len(r1.txt))
    ) calc2
    CROSS APPLY(
      SELECT patidx = charindex(' ', newtxt)
    ) calc3
    CROSS APPLY(
      SELECT newendidx = CASE 
        WHEN patidx = 0 THEN len(newtxt)
        ELSE patidx END
    ) calc4
    CROSS APPLY(
      SELECT newtoken = substring(r1.txt, newstartidx, newendidx)
    ) calc5
  WHERE newendidx > 0
) 
SELECT
  ID,
  --Result
  Name = left(Result, eqIdx - 1),
  Value = substring(Result, eqIdx + 1, len(Result) - eqIdx + 1)
FROM 
  T
  OUTER APPLY (
    SELECT eqIdx = charindex('=', Result)
  ) calc6
WHERE 
  Row != 0
  AND eqIdx != 0
ORDER BY ID

由于表中有多个表达式要解析,因此在没有标识符的情况下引用它们会出现问题。所以,我将 ID 添加到您的临时表中。

CTE 的输出还包含 ID,您可以将其用作对 #retention1.ID 的引用。

于 2013-07-17T09:55:52.550 回答
0

尝试这个:

BEGIN

DECLARE @ret nvarchar (100),@P_string nvarchar (100),
@P_variable    nvarchar (100)/*,
@P_return_null nvarchar(100) = 'Y'*/

set @p_string = 'hello Action=Refer non-action=non-refer'
set @p_variable = 'Action'

select @ret=substring(@p_string, charindex(upper(@P_variable),upper(@P_string)) +len(@p_variable)+1,100) 

select substring(@ret,0,charindex(' ',lower(@ret),0))


END;
于 2013-07-17T09:59:04.743 回答
0

带有一点作弊的大量字符串处理:在开头和结尾使用空格扩展@p_string。

DECLARE @P_string nvarchar (100), @P_variable    nvarchar (100)

set @p_variable = ' Action='

set @p_string = ' hello Action=Refer non-action=non-refer '
select substring(substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)),charindex('=',substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))+1,CHARINDEX(' ', substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))-LEN(@P_variable))

set @p_string = ' bye Action=Follow non-action=non-refer '
select substring(substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)),charindex('=',substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))+1,CHARINDEX(' ', substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))-LEN(@P_variable))

set @p_string = ' hello non-action=non-refer Action=compare '
select substring(substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)),charindex('=',substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))+1,CHARINDEX(' ', substring(@p_string, charindex(upper(@P_variable),upper(@P_string))+1, len(@p_string)-len(@p_variable)))-LEN(@P_variable))
于 2013-07-17T11:37:38.520 回答