0

{}次の段落で囲まれた文字列を T-SQL を使用して解析し、表示する必要があります。

{Term1} を使用したテスト文を次に示します。場合によっては、{Term2} が {Phrase Term3} のような単語またはフレーズになることがあります。{Term2} を繰り返します。一部の用語は、{Term2} のように別の用語の複数形である場合があります。これが本当の {Simple} Term です。

望ましい結果:

Term1
Term2
Phrase Term3
Term2
Term2
Simple
4

2 に答える 2

3

複数ステートメントのテーブル値関数を使用してこれを行うことができますが、このタイプの解析は、より強力な言語に任せた方がはるかに良いと思います。{up to 255 characters}これは、SQL Server のバージョンに応じて、最大約 8,000 文字のトークンと入力文字列を処理します。さらに必要な場合は、独自の数値テーブルsys.all_columnsに置き換えてください。無効なトークン シーケンスから保護するために何の努力もしていないことに注意してください...

CREATE FUNCTION dbo.ParseTokens
(
    @string NVARCHAR(MAX),
    @token1 NVARCHAR(255),
    @token2 NVARCHAR(255)
)
RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAR(255))
AS
BEGIN
    INSERT @t(Item) 
    SELECT SUBSTRING(x, 1, COALESCE(NULLIF(CHARINDEX(@token2, x)-1,-1),255)) 
    FROM 
    (
      SELECT Number, x = SUBSTRING(@string, Number, 
        CHARINDEX(@token1, @string + @token1, Number) - Number)
      FROM
      (
        SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
          FROM sys.all_columns
      ) AS n(Number) WHERE Number <= CONVERT(INT, LEN(@string))
        AND SUBSTRING(@token1 + @string, Number, LEN(@token1)) = @token1
    ) AS y
    ORDER BY Number OPTION (MAXDOP 1);

    DELETE @t WHERE [Index] = 1;

    RETURN;
END
GO

使用例 - スタンドアロン文字列の場合:

DECLARE @x NVARCHAR(MAX);

SET @x = N'foo{bar} and think {splunge}';

SELECT Item FROM dbo.ParseTokens(@x, '{', '}') ORDER BY [Index];

結果:

Item
-------
bar
splunge

使用例 - テーブルに対して:

DECLARE @x TABLE(ID INT IDENTITY(1,1), n NVARCHAR(MAX));

INSERT @x SELECT N'Here is a test sentence with a {Term1}. Sometime, a {Term2}
  could be a word or phrase like {Phrase Term3}. {Term2} is repeated. Some Terms
  could be a plural form of a another Term like {Term2}s. Here is a real
  {Simple} Term.';

INSERT @x SELECT N'Hello {foo} there {bar} ...';

SELECT t.ID, p.Item
 FROM @x AS t
 CROSS APPLY dbo.ParseTokens(t.n, '{', '}') AS p;

結果:

ID     Item
----   ------------
1      Term1
1      Term2
1      Phrase Term3
1      Term2
1      Term2
1      Simple
2      foo
2      bar
于 2013-10-12T00:02:35.537 に答える
3

{すべてを開始要素に置き換え、すべてを終了要素に置き換えることで、文字列を XML に変換し}、XML に対してトークンのクエリを実行できます。

declare @S nvarchar(max)
set @S = N'Here is a test sentence with a {Term1}. Sometime, a {Term2} could be a word or phrase like {Phrase Term3}. {Term2} is repeated. Some Terms could be a plural form of a another Term like {Term2}s. Here is a real {Simple} Term.'

select T.N.value('text()[1]', 'nvarchar(max)') as Token
from (select cast(replace(replace(@S, N'{', N'<token>'), N'}', N'</token>') as xml)) as S(X)
  cross apply S.X.nodes('token') as T(N)

SQL フィドル

于 2013-10-12T08:48:23.790 に答える