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

T-SQLスタッフコマンド

    STUFFと呼ばれるSQLServer関数に関する主なアイデアは、CONCAT関数が提供するよりも柔軟性のある単一の列に複数の列を連結することです。さらに、STUFFを他の手法と組み合わせて、いくつかの興味深い効果を得ることができます。

    この記事では、STUFFコマンドがSQLデータベーススペシャリストに提供する可能性について説明します。

    T-SQLSTUFF関数

    まず、STUFF関数のMicrosoftの公式定義を見てみましょう。

    STUFF関数は、文字列を別の文字列に挿入します。開始位置の最初の文字列の指定された長さの文字を削除してから、開始位置の最初の文字列に2番目の文字列を挿入します。

    したがって、STUFFコマンドを使用すると、列データが再配置されます。

    いくつかの例を見てみましょう。

    最初のものはSTUFFコマンドからの出力です–元のABCDEFG文字列にはXXX文字列が詰め込まれます。

    SELECT STUFF('ABCDEFG',3,3,'XXX');

    この出力を分析して、STUFFコマンドを完全に理解します。

    ここで、3番目のパラメーターが4,5,6の値に増加します。

    SELECT STUFF('ABCDEFG',3,4,'XXX');
    SELECT STUFF('ABCDEFG',3,5,'XXX');
    SELECT STUFF('ABCDEFG',3,6,'XXX');

    関数呼び出しの説明

    置換は、実行のたびに元のABCDEFG文字列の3番目の文字で行われます。唯一の違いは、deletelengthパラメータを介して削除するように指定された文字数です。 。

    したがって、削除の長さ 開始位置からのパラメータ パラメータが元の文字列より長い場合、データは切り捨てられます。

    たとえば、元の文字列の長さは7文字です。 STUFF機能は、位置3から始まり、さらに5文字実行されます。 8は元の文字列の長さ7より大きいため、値はABXXXとして返されます。

    同じクエリでのSTUFFの複数使用

    STUFFコマンドを別のSTUFFコマンド内にネストして、必要な回数だけ利用できます。ただし、それが本番レベルのクエリにどのように影響するかを考慮する必要があります。ネストされた各呼び出しは、返されたデータのすべての行に対して実行されます。

    SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;

    この例では、元の文字列の最初の文字が1文字に置き換えられ、最後の文字が7文字に置き換えられています。

    STUFFとForXML

    ForXMLは、SQLクエリの結果セットをXML形式の結果に変換できるSQLServerの機能です。

    STUFFは、ForXMLなどの他のSQLServer機能と組み合わせることもできます。レポートの目的でデータを統合するのに役立ちます。次のテーブル構造を考えてみましょう。

    2列のレポートが必要だとします。最初の列はUSER_NAME 、2番目はカンマで区切られたロール ユーザーが保持する各役割の列。これを純粋なT-SQLでどのように実現できますか?

    テーブル構造を構築し、データを挿入します:

    CREATE TABLE 
    #USER
    (
    USER_ID INT,
    USER_NAME VARCHAR(50)
    )
    
    CREATE TABLE
    #USER_ROLES
    (
    USER_ID INT,
    ROLE VARCHAR(50)
    )
    
    
    INSERT INTO #USER VALUES(1,'Edward')
    INSERT INTO #USER VALUES(2,'John')
    INSERT INTO #USER VALUES(3,'Mark')
    
    INSERT INTO #USER_ROLES VALUES(1,'Admin')
    INSERT INTO #USER_ROLES VALUES(1,'Writer')
    INSERT INTO #USER_ROLES VALUES(1,'Form')
    INSERT INTO #USER_ROLES VALUES(2,'Writer')
    INSERT INTO #USER_ROLES VALUES(3,'Form')
    INSERT INTO #USER_ROLES VALUES(3,'Writer');
    

    STUFFコマンドを使用します:

    SELECT 
       U.USER_NAME,
       STUFF((SELECT ',' + UR.ROLE 
              FROM #USER_ROLES UR
              WHERE UR.USER_ID = U.USER_ID
              FOR XML PATH('')), 1, 1, '') [ROLES]
    FROM #USER U
    GROUP BY U.USER_NAME, U.USER_ID
    ORDER BY 1
    

    この例では、内部クエリが各USER_IDに結合されています。 STUFFコマンドは、最初のコンマを置き換えるために使用されます。その結果、それぞれの役割を持つ各ユーザーのコンマ区切りのリストができました。

    ユースケース

    データマスキング

    SQL Serverは、動的データマスキングのソリューションを提供します。ただし、STUFFを使用すると、機密データが表示されるときにそれを難読化することができます。 SSNなどの顧客のPIIフィールドがあるテーブルの上に座っているビューを想像してみてください。ビューはSTUFFコマンドを使用して、SSNの最後の4桁を除くすべてをマスクできます。

    データの統合

    FORXMLとSTUFFで示されているように、T-SQLは、ある種のプライマリ識別子を使用してデータを単一の列に統合する機能を提供します。この例では、これはUSER_NAMEでした。ただし、このタイプの分析は、データベースレポートアーキテクチャではかなり一般的です。

    概要

    したがって、T-SQLのSTUFFコマンドのパラメーターについて説明し、このコマンドがCONCATとどのように比較されるかを理解しました。 STUFFコマンドの単純な例と複雑な例の両方を示し、STUFFを適用できるいくつかのユースケースをリストしました。

    それはあなたのベルトの下に持っている素晴らしいツールになることができる貴重なコマンドです。 STUFFコマンドの他の使用例についてコメントしてください。


    1. WEEK()の例– MySQL

    2. データベース設計の主キーとしての一意の識別子(GUID)

    3. PostgreSQL Upsertは、システム列XMIN、XMAXなどを使用して、挿入された行と更新された行を区別します

    4. SQLServerのトリガーのリストを返す