2013-07-17 48 views
4

我有按下面的字段文本列(小樣本,也有很多變化):查找單詞後特定的字符串 - SQL管理工作室2012

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') 

我需要找到「行動後的字=」 示例答案: 輸入1:請參見 註冊2:按照 條目3:比較

如果所有後語‘行動=’是一樣的長度,然後我能做到這一點。不幸的是,所有變化的長度都是未知的。行動之後的詞幾乎總是不同的,不僅僅是上面的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; 
+0

謝謝大家的回覆!非常感謝偉大的解決方案 – user2590676

+1

這裏有謝謝你的按鈕在這裏... – OzrenTkalcecKrznaric

回答

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的參考。

+0

這將失敗的第三個例子''你好非動作=非參考行動=比較' –

+0

@OcasoProtal:你說得對,我正在工作改進 – OzrenTkalcecKrznaric

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; 
+0

第三個例子''hello non-action = non-refer Action = compare''會失敗 –

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))