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

MySQL Group_Concat()とT-SQL String_Agg()

    SQL Server 2017で導入されたT-SQL関数の1つは、STRING_AGG()です。 働き。これは基本的にMySQLのGROUP_CONCAT()と同等です 関数–クエリ結果を行ではなく区切りリストとして返すことができます。

    ただし、2つの機能にはいくつかの小さな違いがあります。

    この記事では、これらの関数間の主な構文の違いのいくつかについて説明します。

    構文

    まず、各関数の公式構文は次のとおりです。

    MySQL – GROUP_CONCAT()

    GROUP_CONCAT([DISTINCT] expr [,expr ...]
                 [ORDER BY {unsigned_integer | col_name | expr}
                     [ASC | DESC] [,col_name ...]]
                 [SEPARATOR str_val])
    

    T-SQL – STRING_AGG()

    STRING_AGG ( expression, separator ) [ <order_clause> ]
    
    <order_clause> ::=   
        WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
    

    構文の違い

    MySQLのGROUP_CONCAT()の3つの主な構文の違いは次のとおりです。 およびT-SQLのSTRING_AGG() 機能:

    • デフォルトのセパレーター :おそらく最も明らかな違いは、STRING_AGG() セパレータを指定する必要があります。 2つの引数(2つ目は区切り文字)を指定しないと、エラーが発生します。 MySQLのGROUP_CONCAT()を使用 一方、関数はオプションの引数です。指定しない場合、デフォルトでカンマが使用されます。
    • 結果の注文 :MySQLとT-SQLの両方の関数を使用すると、ORDER BYを追加できます。 句、構文は少し異なります。 T-SQLでは、WITHIN GROUPを使用する必要があります 結果セットを注文するときの句ですが、MySQLにはこの要件はありません。
    • 明確な結果 :MySQLではDISTINCTを使用できます 一意の値のみを返します。 T-SQLはこのオプションを提供していません。

    以下は、これらの違いを示す例です。

    デフォルトのセパレーター

    MySQL – GROUP_CONCAT()

    MySQLでセパレータを指定する必要はありません。これはオプションの引数です。デフォルト値はコンマです。

    SELECT GROUP_CONCAT(Genre) AS Result
    FROM Genres;

    結果:

    +----------------------------------------------+
    | Result                                       |
    +----------------------------------------------+
    | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |
    +----------------------------------------------+
    

    T-SQL – STRING_AGG()

    T-SQLでは、区切り文字を指定する必要があります。

    SELECT STRING_AGG(Genre, ',') AS Result
    FROM Genres;

    結果:

    Result                                      
    --------------------------------------------
    Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
    

    セパレータを指定しないと、エラーが発生します:

    SELECT STRING_AGG(Genre) AS Result
    FROM Genres;

    結果:

    Error: The STRING_AGG function requires 2 argument(s).
    

    結果の注文

    MySQL – GROUP_CONCAT()

    MySQLで結果セットを注文するときは、ORDER BYを追加するだけです。 引数としての句、順序付けする列、ASCのいずれかが続きます またはDESC 昇順か降順かによって異なります。

    USE Music;
    SELECT 
      ar.ArtistName AS 'Artist',
      GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'
    FROM Artists ar
    INNER JOIN Albums al
    ON ar.ArtistId = al.ArtistId
    GROUP BY ArtistName;

    結果:

    +------------------------+----------------------------------------------------------------------------+
    | Artist                 | Album List                                                                 |
    +------------------------+----------------------------------------------------------------------------+
    | AC/DC                  | Powerage                                                                   |
    | Allan Holdsworth       | The Sixteen Men of Tain,All Night Wrong                                    |
    | Buddy Rich             | Big Swing Face                                                             |
    | Devin Townsend         | Ziltoid the Omniscient,Epicloud,Casualties of Cool                         |
    | Iron Maiden            | Somewhere in Time,Powerslave,Piece of Mind,No Prayer for the Dying,Killers |
    | Jim Reeves             | Singing Down the Lane                                                      |
    | Michael Learns to Rock | Scandinavia,Eternity,Blue Night                                            |
    | The Script             | No Sound Without Silence                                                   |
    | Tom Jones              | Praise and Blame,Long Lost Suitcase,Along Came Jones                       |
    +------------------------+----------------------------------------------------------------------------+
    

    T-SQL – STRING_AGG()

    連結された結果をORDER BYで注文する場合 、SQL Serverでは、WITHIN GROUPが必要です 句を使用します。

    USE Music;
    SELECT 
      ar.ArtistName AS 'Artist',
      STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List'
    FROM Artists ar
    INNER JOIN Albums al
    ON ar.ArtistId = al.ArtistId
    GROUP BY ArtistName;

    結果:

    Artist                     Album List                                                                    
    -------------------------  ------------------------------------------------------------------------------
    AC/DC                      Powerage                                                                      
    Allan Holdsworth           The Sixteen Men of Tain, All Night Wrong                                      
    Buddy Rich                 Big Swing Face                                                                
    Devin Townsend             Ziltoid the Omniscient, Epicloud, Casualties of Cool                          
    Iron Maiden                Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, Killers
    Jim Reeves                 Singing Down the Lane                                                         
    Michael Learns to Rock     Scandinavia, Eternity, Blue Night                                             
    The Script                 No Sound Without Silence                                                      
    Tom Jones                  Praise and Blame, Long Lost Suitcase, Along Came Jones                        
    

    明確な結果

    MySQL – GROUP_CONCAT()

    MySQLのGROUP_CONCAT() DISTINCTをサポートします 結果セットから重複する値を削除できる句。

    USE Solutions;
    SELECT GROUP_CONCAT(DISTINCT TaskName) 
    FROM Tasks;

    結果:

    +--------------------------------------------------------+
    | GROUP_CONCAT(DISTINCT TaskName)                        |
    +--------------------------------------------------------+
    | Do garden,Feed cats,Paint roof,Relax,Take dog for walk |
    +--------------------------------------------------------+
    

    T-SQL – STRING_AGG()

    T-SQLのSTRING_AGG() 関数はDISTINCTをサポートしていません 条項。

    USE Solutions;
    SELECT STRING_AGG(DISTINCT TaskName, ',') 
    FROM Tasks;

    結果:

    Error: Incorrect syntax near ','.
    

    予想どおり、DISTINCTを使用しようとするとエラーが発生します STRING_AGG()を含む句 。


    1. phpを使用したutf-8のoracleからのデータ

    2. JNIエラーが発生しました。インストールを確認して、Eclipse x86Windows8.1で再試行してください。

    3. MyBatis Batch Insert / Update For Oracle

    4. Psycopg2のLoggingConnectionを使用するにはどうすればよいですか?