2012-04-30 7 views
0

言語列を持つテーブルからレコードを取得しようとしています。特定の言語コード(たとえば米国)の行がある場合は、その行が必要ですが、そうでない場合は、ワイルドカードlangコード( "*")を使用して行を取得する必要があります。MySQL OR条件

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

私はそれを行うことはできませんが、このように1つのクエリでデータを検索するアイデアは高く評価されます。

+0

投稿テーブルのスキーマとこれまでに作成したクエリ。 – tuxuday

答えて

0

基本的な答えはかなり簡単です。 OR文のさまざまなセクションを角かっこで囲みます。そして、人々は間違いを犯す傾向がある場所のその一つとして良い見てみましょう - 常に二重のあなたのブラケットをご確認ください:)

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

申し訳ありません - その要件を逃したし、それに対処するための私の答えを編集しました。 unionオペレータが世話をします

select a, b from table where column = 'US' 
union 
select a, b from table where column = '*' 

:データベースサーバーは、SQL Serverの200Xは、OracleやMySQLの場合は今、ブラケットを使用すると、重複行を省略のみunion演算子を使用することができます...

+0

返信いただきありがとうございますが、USと*の両方の行が返されますか?彼らがそこにいるなら私はちょうど米国の列が必要です。 – drorpheus

0

を重要で始めますunion allは重複を返します。また、私は組合がORとは対照的にはるかに優れたパフォーマンスを持っていると信じています。

SQL Serverの::この上さらに読書のために

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

+0

aとbの値が言語によって異なると仮定すると、これはUSと*の行を返します。これはOPが望むものではありません。 –

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 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' 

(また、あなたは常にだけの値のいずれかを選択するように選択内のcase文を追加することができます)