2

そのため、文字列から特定のデータを取得する UDF を作成しようとしています。

  'random text here Task 1234 blah blah more text task 4567'

「タスク1234とタスク4567」を抽出して、このように表示させたい

  'Task 1234, task 4567'

これが私がこれまでに得たものですが、最初のタスクまたは2番目のタスクのいずれかしか取得できないようですが、両方は取得できません。

Alter Function [dbo].[fn_GetTask](@strText VARCHAR(MAX))
RETURNS varchar(1000)
AS
BEGIN
  while patindex('%Task%', @strText) > 0

BEGIN
    SET @strText = substring(@strText, (CHARINDEX(substring(@strText, Patindex('%Task%', @strText) +4, 5), @strText, 5)),5)
    end
RETURN @strText

END

とても長い一日でした。ここで本当に基本的な何かが欠けているように感じます。

4

3 に答える 3

2
ALTER Function [dbo].[fn_GetTask](@strText VARCHAR(MAX))
RETURNS varchar(1000)
AS
BEGIN

    DECLARE @ReturnString VARCHAR(1000) = ''

    WHILE PATINDEX('%Task%', @strText) > 0

    BEGIN

       DECLARE @FoundString VARCHAR(1000) = SUBSTRING(@strText,PATINDEX('%Task%',@strText),9)

       IF (LEN(@ReturnString) > 0)
       BEGIN
          SET @ReturnString += ', '
       END

       SET @ReturnString += @FoundString

       SET @strText = RIGHT(@strText,LEN(@strText) - PATINDEX('%' + @FoundString + '%',@StrText))
    END

    RETURN @ReturnString

END

while ループで述べたように、文字列を上書きする場所は、結果の文字列を検索する場所です。元の文字列をトリミングしたり、進行状況を追跡したりするメカニズムがありませんでした。ここでそれを行う 1 つの方法です。同じステートメントを数回ネストする必要がないように、追加の変数を使用しました。

于 2016-08-17T01:07:39.363 に答える
2

さらに SET ベースのソリューションが必要な場合は、次のように検索できます。

DECLARE @pattern nvarchar(MAX) = N'%task [0-9][0-9][0-9][0-9]%';
DECLARE @input nvarchar(MAX) = N'random text here Task 1212 blah blah more text task 4567';
WITH Src AS
(
    SELECT
        SUBSTRING(@input, PATINDEX(@pattern, @input), 9) Val,
        STUFF(@input, 1, PATINDEX(@pattern, @input)+9, '') Txt
        WHERE PATINDEX(@pattern, @input)>0
    UNION ALL
    SELECT
        SUBSTRING(Txt, PATINDEX(@pattern, Txt), 9),
        STUFF(Txt, 1, PATINDEX(@pattern, Txt)+9, '')
    FROM Src
    WHERE PATINDEX(@pattern, Txt)>0
)
SELECT STUFF((SELECT ', '+Val FROM Src FOR XML PATH('')), 1, 2, '')
于 2016-08-17T06:05:02.950 に答える