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

SQL ServerのCONCAT_WS()

    いくつかのトリックを使用できます:

    • NULLをスキップするには 値: COALESCE()
    • 末尾の区切り文字を避けるには:すべてのアイテムの前に区切り文字を追加し、後で最初の区切り文字を削除します。 STUFF()

    彼は実例 です。 :

    CREATE TABLE foo (
      id INT IDENTITY(1, 1) NOT NULL,
      a VARCHAR(50),
      b VARCHAR(50),
      c VARCHAR(50),
      d VARCHAR(50),
      PRIMARY KEY (id)
    );
    
    INSERT INTO foo (a, b, c, d) VALUES ('a', 'b', 'c', 'd');
    INSERT INTO foo (a, b, c, d) VALUES (NULL, 'b', NULL, 'd');
    INSERT INTO foo (a, b, c, d) VALUES ('a', NULL, NULL, 'd');
    INSERT INTO foo (a, b, c, d) VALUES (NULL, NULL, NULL, NULL);
    
    SELECT id,
    STUFF(
        COALESCE('; ' + a, '') +
        COALESCE('; ' + b, '') +
        COALESCE('; ' + c, '') +
        COALESCE('; ' + d, ''),
    1, 2, '') AS bar
    FROM foo
    ORDER BY id
    
    | ID | BAR        |
    |----|------------|
    |  1 | a; b; c; d |
    |  2 | b; d       |
    |  3 | a; d       |
    |  4 | (null)     |
    

    STUFF(..., 1, 2, '')の目的 最初の区切り文字(2)を削除することです この場合のセパレータの長さです。

    これはSQLServer2005(および場合によっては以前のバージョン)で機能するはずです。

    注:元のCONCAT_WS()とは異なります 、私たちのバージョンはNULLを返します すべてのアイテムがNULLの場合 。正直なところ、それがより良い選択だと思いますが、とにかく簡単に変更できるはずです。



    1. ループのないセットまたはシーケンスを生成する–パート1

    2. MySQL DROP UNIQUE CONSTRAINT

    3. PostgreSQLに最適なDBaaSソリューション

    4. postgreSQLmysqloracleの違い