2016-04-18 5 views
4

をJSONを生成するために、CONCAT()およびCOALESCE()を組み合わせて、このように非NULL値を引用しながら、私は、のMySQL 5.0(NULL値をフィルタリングするので、何の組み込みを必要としません値をは、私は関数から小さなJSONブロックを構築していますMySQLの

  • COALESCE(CONCAT('[', 
        group_concat(
         CONCAT('{ "key": "', REPLACE(a.val, '"', '\\"'), '"}') 
         SEPARATOR ', ') 
    , ']'), 'null') AS jsonval 
    

    この(これは、完全なJSONブロックに埋め込まれる値である)のようなものを出力:値なし[{"key": "foo"}, {"key": "bar"}, {"key": "baz"}]

  • を(NUL JSON関数)でL):空の文字列とnull
  • :私は私のリストにエントリを追加したいが、何も値が見つからない場合は、文字列null代わりの完全なリストを持っている各a.valに対して[{"key": ""}]

。それはかなりうまく動作しますが、空の文字列だけでなく、得られるJSONの値としてNULLの値をnullとして処理する必要があります。

REPLACE()CONCAT()とnull値のために一緒にかなりよくCOALESCE()仕事が、空の文字列が検出されていない、どのように私はNULLと空の文字列は、同じように扱うことができますか?

null値のストライピングについてはthis questionを見ましたが、私はその逆を探しています。

+2

は、なぜあなたはSQLコード内からJSONを生成していますか?一般的には(データベース操作ではなくアプリケーション/データ転送の問題であるため)これを行うべきではありません。 – Dai

+1

私はMySQL 5.0を使用すべきではありません...ビジネス要件!このJSONは転送するのではなく、レポート/保守目的で使用するため、エクスポート用の外部ツールを追加することはできません。 – Preuk

+0

編集後:http://stackoverflow.com/questions/12818897/mysql-group-concat-vs-coalesce-concerning-null-values – Preuk

答えて

6

あなたのアイデアをちょうど繰り返す!あなたの編集後

COALESCE(CONCAT('[', 
    group_concat(
     CONCAT('{ "key": ',COALESCE(CONCAT('"', REPLACE(a.val, '"', '\\"'), '"'), 'null') ,'}') 
     SEPARATOR ', ') 
, ']'), 'null') AS jsonval 

COALESCE(CONCAT('[', 
    group_concat(
     CONCAT('{ "key": ', 
      CASE WHEN a.val IS NULL THEN 'null' 
       WHEN a.val = '' THEN 'null' 
       ELSE CONCAT('"', REPLACE(a.val, '"', '\\"'), '"') 
      END 
     ,'}') 
    SEPARATOR ', ') 
, ']'), 'null') AS jsonval 
+0

これも試しました...問題はREPLACE(NULL、 'foo'、 'bar')はヌルではなく空の文字列を返すので、COALESCEは決してトリガーしません – Preuk

+1

テストでうまく動作します。構成かもしれません。結果として、COALESCE(CONCAT( 'foo'、REPLACE(NULL、 'foo'、 'bar')、 'bar')、 'nUlL')を選択します。 + -------- + |結果| + -------- + | | + -------- + –

+0

私の悪い、データベースの偽の空文字列を確認してください。 – Preuk