0

言語列を持つテーブルからレコードを取得しようとしています。特定の言語コード (例: US ) の行がある場合は、それらの行が必要ですが、ない場合は、ワイルドカード言語コード ("*") を含む行を取得する必要があります。

これは、クエリの後に結果をフィルタリングせずに 1 つのクエリで実行できますか?

できるとは思いませんが、この方法で 1 回のクエリでデータを取得するアイデアをいただければ幸いです。

4

3 に答える 3

0

自己参加してみてください

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'

(クエリはたとえば、試行されません)

于 2012-04-30T21:31:39.910 に答える
0

基本的な答えは非常に単純です。OR ステートメントのさまざまなセクションを括弧で囲みます。そして、人々が間違いを犯しがちな場所の 1 つであるため、よく見てください - 常に括弧を再確認してください :)

where (column = 'US' 
   or (column = '*' 
       and not exists (select 'x' from table where column = 'US') ) )

申し訳ありません-その要件を逃し、それに対処するために私の回答を編集しました。今、括弧が重要になり始めます...

于 2012-04-30T04:14:04.190 に答える
0

データベース サーバーが 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

MySQL: http://dev.mysql.com/doc/refman/5.1/en/union.html

于 2012-04-30T05:28:03.320 に答える