2

SQL query検索パラメータに応じて色の名前を取得したいがあります。(データベース: Oracle10、フロントエンド: Java)

テーブル (table1)

ID  COLORNAME
--- --------------------
1   Blue
2   Light Blue
3   Dark Blue
4   Dark Red
5   Light Red
6   Red

以下は、単語を含む色のリストを取得するクエリですRed(検索パラメーターはRed)

select * from table1
where colorname LIKE '%Red%'

出力:

ID  COLORNAME
--- --------------------
4   Dark Red
5   Light Red
6   Red

上記の出力は正しいですが、最初に でColorName始まるRed必要があり、次に という単語を含む色が必要Redです。

期待:

ID  COLORNAME
--- --------------------
6   Red
4   Dark Red
5   Light Red

では、どうすればクエリでこれを達成できますか?

4

4 に答える 4

2

は、赤を最初にすることをどのように決定したかによって異なります。あなたの特定のケースでは

select * 
from table1
where colorname LIKE '%Red%'
order by nullif(colorname , 'Red') nulls first
于 2013-06-15T08:32:45.897 に答える
1

データ モデルに「家族」と「役職」を追加することをお勧めします。

ID  FAMILY POS COLORNAME  
--- --------------------  
4   Red    20  Dark Red  
5   Red    30  Light Red  
6   Red    10  Red  

その後、できますorder by family, pos, colorname。他の並べ替えスキーマを柔軟に定義できます。

高速化するために、これらの列にインデックスを付けることができます。「%red%」を使用すると、おそらく常にフル テーブル スキャンになります。

于 2013-06-15T08:46:53.393 に答える
1
(select * from table1 where colorname = 'red')
union
(select * from table1 where colorname like '%red%' and colorname != 'red')

編集:これについて考えると、実際には保証されたソートではありませんが、おそらくすべての場合にそうなるでしょう。

このメソッドを保証するには、これを行う必要があります。

(select <cols>, colorname, 1 as i from table1 where colorname = 'red')
union
(select <cols>, colorname, 2 as i from table1 where colorname like '%red%' and colorname != 'red')
order by i, colorname

または@hakiの提案を使用できます

もう一度編集して、実際にはいくつかの dbms でこれを行うより簡単な方法があると思います:

select * from table1
where colorname like '%red%'
order by (colorname = 'red') desc, colorname
于 2013-06-15T08:30:18.963 に答える
1

これをより一般的な基準に拡張すると、正確な一致は最小の長さのものになると思います。

したがって、次のことができます。

with required_rows as (
  select t.*
         length(colorname)              length_colorname    ,
         min(length(colorname)) over () min_length_colorname
  from   table1
  where  colorname like '%Red%')
select   id,
         colorname
from     required_rows
order by case length_colorname
           when min_length_colorname then 0
           else 1
         end,
         colorname

他の行を並べ替える必要がない場合は、もちろん長さ (色名) で並べ替えることができます。

于 2013-06-15T09:33:18.070 に答える