2011-06-21 6 views
1

私はアプリケーションのような設定パラメータを格納するテーブルを有している:「設定セット」、各パラメータは、キー/値の組み合わせJPQLは非スカラーを結合しますか?

setName | key  | value 
---------------------------------- 
dev  | FooEnabled | true 
dev  | BarEnabled | true 
qa  | FooEnabled | false 
...etc... 

特定に属し私は今

dev | FooEnabled | true 
dev | BarEnabled | true 

戻って取得したい私が選択したいと思いますので、私は"dev"という名前の設定セット内のすべてのパラメーターを望んでいた場合

SELECT p Parameter p WHERE p.setName = :name 

:それは特定のセット内のすべてのプロパティを選択するのは簡単です二組の組合:012とセットのプロパティよりname1高い優先順位とセットでの特性を与えることによって、重複キーを持つ行を

SELECT p Parameter p WHERE p.setName = :name1 OR p.setName = :name2 

...しかしなくします。 name1"qa"だったとname2"dev"た場合、これは、クエリが選択する必要があり、

dev | FooEnabled | true 
qa | BarEnabled | false 

を明確にするために戻ってくる:

  • すべてのプロパティを設定してから名前name2、除いて...
  • name1という名前の同じキーを持つプロパティがあります。この場合、...
  • で行を選択してください代わりに、これを効率的に何をするかJPQLクエリsetName = :name2

と行の?COALESCE場合は非スカラー値で働いていた、そして私はこのような何かが仕事ができることを想像:

SELECT 
    COALESCE(x, y) 
    FROM Property x, Property y 
    WHERE 
     x.setName = :name1 AND 
     y.setName = :name2 AND 
     x.key = y.key 

しかしCOALESCEはスカラー値のみを受け入れます。何か案は?


その他のクエリは、/試みたが失敗しました:(もし

SELECT 
    CASE 
     WHEN (NOT EXISTS (SELECT y FROM Property y WHERE y.setName = :name1 AND y.key = x.key)) 
     THEN x 
     ELSE y 
    END 
    FROM Property x 
    WHERE 
     x.setName = :name2 

私は次のようになりますと仮定しkey、によって、また同じように、個々の行を選択するに興味があります非スカラーの場合はCOALESCEのみ):

SELECT 
    COALESCE(y, x) 
    FROM Property x, Property y 
    WHERE 
     x.key = :key AND 
     x.setName = :name1 AND 
     y.key = :key AND 
     y.setName = :name2 

答えて

0

おそらく、あなたはbasica LLY構造次:私は今、これで遊んだ

SELECT 
    Property p, 
    CASE WHEN setName=:name1 
     THEN 1 
     ELSE 0 
    as orderColumn 
FROM Property x 
WHERE x.setName = :name1 OR (x.setName =:name2 AND (NOT EXISTS (SELECT y FROM Property y WHERE y.setName = :name1 AND y.key = x.key))) 
ORDER BY orderColumn 

+0

(ちょうど私の心からのそれが試さなくても)、私は 'orderColumn'発注のポイントが表示されません... –

+0

@Matt Ball私はあなたの文章を 'name2とのセットのプロパティよりもname1高い優先順位を持つプロパティを与えることで解釈しました。これは、一番上にname1、name2で一致するすべてのマッチングのセット内に要素を入れたいと思っています。下...おそらくそれは間違っている... – Omnaest

関連する問題