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

NULL値を持つNOTLIKEの動作

    NULLについて

    'anything' NOT LIKE NULL NULLを生成します 、TRUEではありません 。
    そしてTRUEのみ WHEREのフィルター式の対象 条項。

    ほとんどの関数はNULLを返します NULLで 入力(例外があります)。それがNULLの性質です 任意 適切なRDBMS。

    シングルが必要な場合 表現、あなたはできた 使用:

    AND   (column_default LIKE 'nextval%')  IS NOT TRUE;
    

    しかし、それはほとんど短くも速くもありません。マニュアルの詳細。

    適切なクエリ

    あなたの質問はまだ信頼できません。 Postgresデータベースでは、テーブル名だけでは一意ではありません。さらにスキーマ名を指定するか、現在のsearch_pathに依存する必要があります。 その中の最初の一致を見つけるには:

    関連:

    • search_pathは識別子の解決と「現在のスキーマ」にどのように影響しますか
    SELECT column_name
    FROM   information_schema.columns
    WHERE  table_name = 'hstore1'
    AND    table_schema = 'public'   -- your schema
    AND   (column_default IS NULL OR
           column_default NOT LIKE 'nextval%');

    より良いですが、それでも防弾ではありません。 'nextval'で始まる列のデフォルトは、serialを作成しません 、 まだ。参照:

    • テーブル列の自動インクリメント

    確かに、使用中のシーケンスがpg_get_serial_sequence(table_name, column_name)の列によって「所有」されているかどうかを確認してください。 。

    自分で情報スキーマを使うことはめったにありません。これらの遅く肥大化したビューは、メジャーバージョン間での移植性を保証し、他の標準準拠のRDBMSへの移植性を目指しています。しかし、多すぎるととにかく互換性がありません。オラクルは情報スキーマさえ実装していません(2015年現在)。

    また、有用なPostgres固有の列が情報スキーマにありません。この場合、次のようにシステムカタログを照会できます。

    SELECT *
    FROM   pg_catalog.pg_attribute a
    WHERE  attrelid = 'table1'::regclass
    AND    NOT attisdropped   -- no dropped (dead) columns
    AND    attnum > 0         -- no system columns
    AND   NOT EXISTS (
       SELECT FROM pg_catalog.pg_attrdef d
       WHERE  (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
       AND    d.adsrc LIKE 'nextval%'
       AND    pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
       );
    

    より速く、より信頼性がありますが、移植性は低くなります。

    マニュアル:

    カタログpg_attrdef 列のデフォルト値を格納します。列に関する主な情報は、pg_attributeに保存されます (下記参照)。デフォルト値を明示的に指定する列(テーブルが作成されるとき、または列が追加されるとき)のみがここにエントリを持ちます。

    'table1'::regclass search_pathを使用します 名前を解決し、あいまいさを回避します。名前をスキーマ修飾して無効にすることができます:'myschema.table1'::regclass

    関連:

    • テーブル、フィールド、スキーマ名を使用して、参照されているテーブル名を検索します
    • Postgresのテーブル列のデフォルト値を取得しますか?


    1. ServiceNowとOracleIdentityCloud Service(IDCS)の統合

    2. MySQLで英数字を含む行を返す2つの方法

    3. Oracleデータベースにブール型はありますか?

    4. SQLを使用して日付の範囲を生成する