1

SQLlikeクエリが必要で、最初に順序付けられた入力パラメーターで始まる結果があり、残りの結果はアルファベット順に並べ替えられます。

だから私が持っているなら

Foobbb
aaafoo
Fooaaa
bFoob
cccfooccc

そして、私はそれを次のようにソートしたいfooを検索します。

Fooaaa
Foobbb
aaafoo
bFoob
cccfooccc

私の最も関連性の高いアイテムが最初になるように。これを行うための明確で優れたパフォーマンスの方法が必要ですか?一時テーブルを作成することはできましたが、オーバーヘッドが大きすぎると思いました。

私は試した

DECLARE cemployer CURSOR
WITH RETURN
FOR SELECT employer
    FROM   ((SELECT employer_name,  1 AS grp
             FROM   employer e
             WHERE  Upper(employer_name) LIKE Upper(i_employer|| '%'))
            UNION
            (SELECT employer_name, 2   AS grp
             FROM   employer e
             WHERE  Upper(employer_name) LIKE Upper('%'||i_employer|| '%')))
    ORDER  BY grp,
              employer;

OPEN cemployer;  

しかし、これを行うと、

Fooaaa
Foobbb

結果セットの下部で再度繰り返されます。DB2では、外部クエリを区別することはできません。substringやlocate、またはその他の文字列関数を実行することでこの問題を解決できることはわかっていますが、これを実行して重複が返されないようにするための最も洗練された方法を知りたいと思いました。

4

2 に答える 2

7

一般的な方法

ORDER BY CASE WHEN col like 'foo%' THEN 1 ELSE 2 END,col
于 2012-08-21T13:45:11.563 に答える
1

問題は、emplyerが両方のグループに一致し、最初の一致のみが必要なことです。これを修正する1つの方法は、クエリを次のグループに変更することです。

SELECT employer
FROM   ((SELECT employer_name,  1 AS grp
         FROM   employer e
         WHERE  Upper(employer_name) LIKE Upper(i_employer|| '%')
        )  UNION
        (SELECT employer_name, 2   AS grp
         FROM   employer e
         WHERE  Upper(employer_name) LIKE Upper('%'||i_employer|| '%')
        )
       )
group by employer
ORDER  BY min(grp), employer; 

これは、各グループを定義するロジックをいじることなく、非常に簡単に修正する方法です。

于 2012-08-21T13:47:05.680 に答える