言語列を持つテーブルからレコードを取得しようとしています。特定の言語コード (例: US ) の行がある場合は、それらの行が必要ですが、ない場合は、ワイルドカード言語コード ("*") を含む行を取得する必要があります。
これは、クエリの後に結果をフィルタリングせずに 1 つのクエリで実行できますか?
できるとは思いませんが、この方法で 1 回のクエリでデータを取得するアイデアをいただければ幸いです。
自己参加してみてください
SELECT a.*, b.field as field_original FROM `table` a
LEFT JOIN `table` b ON (a.id = b.id AND b.lang = '*')
WHERE a.lang = 'US'
次に、アプリケーションでフィールドが存在するかどうかを確認し、フィールドを使用します。それ以外の場合は、field_originalを使用します(select内にcaseステートメントを追加して、常に値の1つのみを選択することもできます)
SELECT CASE a.field IS NULL THEN b.field ELSE a.field END
FROM `table` a
LEFT JOIN `table` b ON (a.id = b.id AND b.lang = '*')
WHERE a.lang = 'US'
(クエリはたとえば、試行されません)
基本的な答えは非常に単純です。OR ステートメントのさまざまなセクションを括弧で囲みます。そして、人々が間違いを犯しがちな場所の 1 つであるため、よく見てください - 常に括弧を再確認してください :)
where (column = 'US'
or (column = '*'
and not exists (select 'x' from table where column = 'US') ) )
申し訳ありません-その要件を逃し、それに対処するために私の回答を編集しました。今、括弧が重要になり始めます...
データベース サーバーが SQL Server 200X、Oracle、または MySQL の場合、union
重複する行を省略する演算子を単独で使用できます。
select a, b from table where column = 'US'
union
select a, b from table where column = '*'
union
オペレーターは重複を処理し、asもunion all
重複を返します。また、OR とは対照的に、union ははるかに優れたパフォーマンスを発揮すると思います。
これについてさらに読むには:
SQL サーバー: http://msdn.microsoft.com/en-us/library/ms180026.aspx
オラクル: http://docs.oracle.com/cd/B12037_01/server.101/b10759/queries004.htm