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

一致するものがない場合は、最初のレコードを選択します

    あなたは正しい方向に進んでいます。 order byを追加するだけです :

    SELECT street, zip, city
    FROM address
    WHERE street LIKE 'Test%' OR ord = 0
    ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
    LIMIT 1;
    

    または、代わりに:

    ORDER BY ord DESC
    

    これらのいずれかにより、ord = 0が配置されます 最後の行。

    編集:

    アーウィンは、インデックスの使用の観点から、ORという良い点を提起します WHEREで 条項は最善のアプローチではありません。答えを次のように変更します:

    SELECT *
    FROM ((SELECT street, zip, city
           FROM address
           WHERE street LIKE 'Test%'
           LIMIT 1
          )
          UNION ALL
          (SELECT street, zip, city
           FROM address
           WHERE ord = 0
           LIMIT 1
          )
         ) t
    ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
    LIMIT 1;
    

    これにより、クエリで2つのインデックス(street)を利用できるようになります。 およびord )。これは実際にはLIKEが原因であることに注意してください パターンはワイルドカードで始まりません。 LIKEの場合 パターンはワイルドカードで始まり、この形式のクエリでも全表スキャンが実行されます。



    1. SQL Server(T-SQL)でデータベースメールの構成設定を確認する方法

    2. Oracleテーブルの動的パーティション

    3. 接続文字列でのisqlの使用

    4. 複数の値に一致するOracleの行の削除