sql >> データベース >  >> RDS >> Sqlserver

SQLの行ごとにグループごとに単語を区切る

    うわー、あなたはあなたのテーブルを再設計するべきです。とにかく、これがJeffModenの DelimitedSplit8kを使用した私の試みです。 。

    以前の質問 の1つに回答したので、この機能が利用できるようになったと思います。 この関数も使用します。

    まず、@stringを分割します 別々の行に入力します。 Group_Wordsも分割する必要があります テーブル。

    その後、LEFT JOINを実行します 一致するカテゴリを取得します。次に、無効な単語を削除します。

    ここで実際の動作を確認してください: SQL Fiddle

    DECLARE @string VARCHAR(8000)
    SET @string = 'No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,Night,walking,water,Two Person,looking Down'
    
    -- Split @string variable
    DECLARE @tbl_string AS TABLE(ItemNumber INT, Item VARCHAR(8000))
    INSERT INTO @tbl_string
    SELECT
        ItemNumber, LTRIM(RTRIM(Item))
    FROM dbo.DelimitedSplit8K(@string, ',')
    
    -- Normalize Group_Words
    DECLARE @tbl_grouping AS TABLE(Category VARCHAR(20), ItemNumber INT, Item VARCHAR(8000))
    INSERT INTO @tbl_grouping
    SELECT
        w.Category, s.ItemNumber, LTRIM(RTRIM(s.Item))
    FROM Group_Words w
    CROSS APPLY dbo.DelimitedSplit8K(w.[Group], ',')s
    
    ;WITH Cte AS(
        SELECT      
            s.ItemNumber,
            s.Item,
            g.category,     
            RN = ROW_NUMBER() OVER(PARTITION BY g.Category ORDER BY s.ItemNumber)
        FROM @tbl_string s
        LEFT JOIN @tbl_grouping g
            ON g.Item = s.Item
    )
    SELECT STUFF((
            SELECT ',' + Item
            FROM Cte
            WHERE 
                RN = 1
                OR Category IS NULL
            ORDER BY ItemNumber
            FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),
        1, 1, '')
    

    出力

    |                                                                                                  |
    |--------------------------------------------------------------------------------------------------|
    | No People,Day,side view,looking at camera,snow,mountain,tranquil scene,tranquility,walking,water |
    

    @stringの場合 入力に8000を超えています 文字、DelimitedSplit8K 速度が低下します。代わりに他のスプリッターを使用できます。これは、アーロンベルトランズ卿の記事 から抜粋したものです。 。

    CREATE FUNCTION dbo.SplitStrings_XML
    (
       @List       NVARCHAR(MAX),
       @Delimiter  NVARCHAR(255)
    )
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
       RETURN 
       (  
          SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
          FROM 
          ( 
            SELECT x = CONVERT(XML, '<i>' 
              + REPLACE(@List, @Delimiter, '</i><i>') 
              + '</i>').query('.')
          ) AS a CROSS APPLY x.nodes('i') AS y(i)
       );
    GO
    



    1. plpython3uプロシージャ内でPythonパッケージをインポートするときにモジュールが見つかりません

    2. mysql ERROR 1064(42000):SQL構文にエラーがあります。

    3. PHPを使用してMySQLテーブルのすべての行にAUTO_INCREMENT列を再割り当てする方法

    4. macosx上のpythonとmysql