SQLで、ある文字列を含むレコードを取得します。

ただし、文字列の先頭からマッチするものを優先させたいのです。
1回のSQLでできるでしょうか?

通常、
『SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY name ASC;』
と入力すると、
『arrow, now, snow, wake, world』
のような順番になります。
しかし、そうではなく、
『wake, world, arrow, now, snow』
のように、まず文字列の頭からヒットするものを優先したいのです。

つまり、
『WHERE name LIKE 'w%' ORDER BY name ASC』と
『WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC』
の結果を、混ぜ合わせるのではなく、前後につなぎ合わせたいのです。

MySQL、またはSQLiteにおいて、どのような方法を採ればいいでしょうか?
なるべく1文のSQLで行いたいのですが…。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/10/31 16:28:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.4

回答回数1422ベストアンサー獲得回数226

ポイント70pt

CASE文を使って以下のようにするのはどうでしょうか?

SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY (CASE WHEN name LIKE 'w%' THEN 0 ELSE 1 END), name ASC;

手元のSQLiteでは上手く動きました。

ただし大量データの場合のパフォーマンスがどうなるかは分かりませんが…。

id:sutara_lumpur

こちらのMySQL、SQLiteでも問題なく動きました。

不勉強なため、CASE文の存在というものを知りませんでした。

教えていただいたSQLがどういう働きをしているのか

理解できるように勉強します。

ありがとうございました。

2009/10/31 16:26:55

その他の回答3件)

id:vegah No.1

回答回数496ベストアンサー獲得回数2

ポイント10pt

今手元のPCでMSアクセスしかなくて、クエリーでやってみたのですが、

もうひとつ昇順のキイ項目を作ってそこに、

name LIKE 'w% だったら『1』をセットし、

そうでなかったら『2』をセットする

として、このキイ項目を昇順の第一キイとし、

nameを昇順の第二キイにすれば、wが先頭にくるnameの方が優先してソートされます。

id:sutara_lumpur

すみません…。具体的なSQLで示してもらえないでしょうか。

不勉強なため、うまくイメージがわかなくて…。

2009/10/31 13:31:49
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント10pt

素直にやれば UNION 使うのが手っ取り早そうだねぇ。

 SELECT * FROM hoge
  WHERE name LIKE 'w%' ORDER BY name ASC
UNION
 SELECT * FROM hoge
  WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7.2 UNION 構文

SQLite が認識する SQL - Third impact

もちろん他の構文もあるけど、ややこしくなるだけの気がする。

id:sutara_lumpur

すみません。UNIONではどうしてもうまくいかなかったので、

ややこしくてもかまいませんので、ほかの方法を教えていただけないでしょうか?

2009/10/31 14:09:04
id:y-kawaz No.3

回答回数1422ベストアンサー獲得回数226

ポイント10pt

UNIONを使えば1回のSQLで単純に繋げられます。

SELECT * FROM hoge WHERE name LIKE 'w%' ORDER BY name ASC
UNION
SELECT * FROM hoge WHERE name LIKE '%w%' AND name NOT LIKE 'w%' ORDER BY name ASC;
id:sutara_lumpur

なぜか私のPCでは、MySQLでもSQLite2でも、正常に動作しませんでした。

参考にした本では、括弧()でくくればいいとも書かれていましたが、

やはりうまくいかず…。

XAMPP1.7.2を入れているのですが、これがマズいんでしょうか…

2009/10/31 14:07:49
id:y-kawaz No.4

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント70pt

CASE文を使って以下のようにするのはどうでしょうか?

SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY (CASE WHEN name LIKE 'w%' THEN 0 ELSE 1 END), name ASC;

手元のSQLiteでは上手く動きました。

ただし大量データの場合のパフォーマンスがどうなるかは分かりませんが…。

id:sutara_lumpur

こちらのMySQL、SQLiteでも問題なく動きました。

不勉強なため、CASE文の存在というものを知りませんでした。

教えていただいたSQLがどういう働きをしているのか

理解できるように勉強します。

ありがとうございました。

2009/10/31 16:26:55
  • id:sutara_lumpur
    CASE文というものを調べてみて分かったのですが、
    vegahさんの教えてくださった方法が、すなわち
    y-kawazさんの回答のSQLだったんですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません