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

PostgreSQLは標準のSQL構文を強制します

    PostgreSQLにはそのような機能はありません。たとえそうだったとしても、SQL標準の解釈が異なり、標準の構文と機能のサポートが異なり、一部のDBは、他のDBが強制する制限や、他のDBが適用しない制限について緩和されているため、あまり役に立ちません。構文はあなたの問題の中で最も少ないです。

    クロスDBポータブルSQLを作成する唯一の信頼できる方法は、自動テストスイートの一部としてすべてのターゲットデータベースでそのSQLをテストすることです。 。そして、多くのことを誓います。

    多くの場所で、クエリパーサー/リライターはクエリの標準の「スペル」をPostgreSQLの内部形式に変換します。これは、ダンプ/リロード時に発行されます。特に、PostgreSQLは、ビュー、チェック制約式、インデックス式などの生のソースコードを保存しません。内部解析ツリーを保存し、オブジェクトのダンプまたは表示を求められたときに、そこからソースを再構築します。

    例:

    regress=> CREATE TABLE sometable ( x varchar(100) );
    CREATE TABLE
    regress=> CREATE VIEW someview AS SELECT CAST (x AS integer) FROM sometable;
    CREATE VIEW
    regress=> SELECT pg_get_viewdef('someview');
               pg_get_viewdef            
    -------------------------------------
      SELECT (sometable.x)::integer AS x
        FROM sometable;
    (1 row)
    

    とにかく、標準はかなり一般的で重要な機能の一部を指定できず、定義するものの仕様がかなりあいまいであることが多いため、かなり役に立たないでしょう。たとえば、最近まで、クエリによって返される行数を制限する方法が定義されていなかったため、データベースごとに独自の異なる構文( TOP )がありました。 、 LIMIT /オフセット など)。

    標準で指定されている他のことはほとんどのベンダーによって実装されていないため、それらを使用することはかなり無意味です。すべてのDBベンダーでSQL標準で生成されたID列を使用して頑張ってください。

    CASTを使用する「標準スペルを優先する」ダンプモードがあると非常に便利です。 ::の代わりに などですが、一部の変換は1:1のリバーシブルではないため、実行するのは実際には簡単ではありません。例:

    regress=> CREATE VIEW v AS SELECT '1234' SIMILAR TO '%23%';
    CREATE VIEW
    regress=> SELECT pg_get_viewdef('v');
    
     SELECT ('1234'::text ~ similar_escape('%23%'::text, NULL::text));
    

    または:

    regress=> CREATE VIEW v2 AS SELECT extract(dow FROM current_date);
    CREATE VIEW
    regress=> SELECT pg_get_viewdef('v2');
    
     SELECT date_part('dow'::text, ('now'::text)::date) AS date_part;
    

    そのため、必要なことが可能になる前に、PostgreSQLが関数や式を内部的に表現および操作する方法に大幅な変更を加える必要があることがわかります。

    SQL標準のものの多くは、PostgreSQLが解析中に関数呼び出しに変換してキャストするファンキーな1回限りの構文を使用しているため、SQLコミットが別の頭脳を持ち、新しい創造的なビットを引き出すたびに特別なケースの機能を追加する必要はありません構文解析の...どこか。これを変更するには、大量の新しい式ノードタイプと一般的な混乱を追加する必要がありますが、実際には何のメリットもありません。



    1. SAPIQをSQLServerに接続します

    2. SQLiteのバージョンを確認してください

    3. 休止状態でデータベースをバックアップ/フェイルオーバーとして使用するにはどうすればよいですか?

    4. SQL Server 2008 で日付と時刻を検索する