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

PostgreSQLは文字列から日付へのキャストでインデックスを作成します

    最初のエラーは、日付をvarchar列として格納することでした。あなたはそれをすべきではありません。

    問題の適切な修正は、列を実際のdateに変換することです。 列

    これで、そのステートメントに対する答えは「データベースを設計しておらず、変更できない」であると確信しているので、回避策を次に示します。

    CAST およびto_char() 現在のセッションの設定に応じて、同じ入力値に対して異なる値を返す可能性があるため、不変ではありません。

    テーブル内のすべての値の形式が一貫していることがわかっている場合(これがあれば、列を実際のdateに変換できることを意味します。 列)次に、varcharを日付に変換し、不変としてマークされる独自の関数を作成できます。

    create or replace function fix_bad_datatype(the_date varchar)
       returns date
       language sql
       immutable
    as
    $body$
      select to_date(the_date, 'yyyy-mm-dd');
    $body$
    ROWS 1
    /
    

    その定義を使用して、式にインデックスを作成できます:

    CREATE INDEX date_index ON table_name (fix_bad_datatype(varchar_column));
    

    しかし、あなたは Postgresがそれを使用するように、クエリでその関数呼び出しを正確に使用するには:

    select *
    from foo
    where fix_bad_datatype(varchar_column) < current_date;
    

    varchar列に「不正な」値が1つしかない場合、このアプローチはひどく失敗することに注意してください。唯一の賢明な解決策はです 日付をdateとして保存する s、



    1. MySQLストアドプロシージャ、複数のカーソルとクエリ結果の処理

    2. MySQL LEFTJOIN3テーブル

    3. コロン記号はSQLクエリで何をしますか?

    4. ストアドプロシージャSQL実行プラン