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

レコードにjsonまたは文字列が混在している場合に、Postgresで「タイプjsonの無効な入力構文」を防止する方法

    無効なJSONを含む行をスキップする場合は、最初にテストする必要があります テキストが有効なJSONである場合。これを行うには、値の解析を試み、無効なJSON値の例外をキャッチする関数を作成します。

    CREATE OR REPLACE FUNCTION is_json(input_text varchar) RETURNS boolean AS $$
      DECLARE
        maybe_json json;
      BEGIN
        BEGIN
          maybe_json := input_text;
        EXCEPTION WHEN others THEN
          RETURN FALSE;
        END;
    
        RETURN TRUE;
      END;
    $$ LANGUAGE plpgsql IMMUTABLE;
    

    それがある場合は、is_jsonを使用できます CASEの関数 またはWHERE 有効な値を絞り込むための句。

    -- this can eliminate invalid values
    SELECT user_data::json #> '{user,name}'
    FROM users WHERE is_json(user_data);
    
    -- or this if you want to fill will NULLs
    SELECT
      CASE
        WHEN is_json(user_data)
          THEN user_data::json #> '{user,name}'
        ELSE
          NULL
      END
    FROM users;
    


    1. Postgres UPSERTは、UPDATE時にINSERTからの列値を再利用します

    2. PHP/Mysqlの特殊文字の挿入が切り捨てられています

    3. ERROR 1064(42000)によるオーバーパーティションの構文でのデータベースエラー

    4. MySQLのSUM()関数