ただし、文字列の先頭からマッチするものを優先させたいのです。
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で行いたいのですが…。
CASE文を使って以下のようにするのはどうでしょうか?
SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY (CASE WHEN name LIKE 'w%' THEN 0 ELSE 1 END), name ASC;
手元のSQLiteでは上手く動きました。
ただし大量データの場合のパフォーマンスがどうなるかは分かりませんが…。
今手元のPCでMSアクセスしかなくて、クエリーでやってみたのですが、
もうひとつ昇順のキイ項目を作ってそこに、
name LIKE 'w% だったら『1』をセットし、
そうでなかったら『2』をセットする
として、このキイ項目を昇順の第一キイとし、
nameを昇順の第二キイにすれば、wが先頭にくるnameの方が優先してソートされます。
すみません…。具体的なSQLで示してもらえないでしょうか。
不勉強なため、うまくイメージがわかなくて…。
素直にやれば 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
もちろん他の構文もあるけど、ややこしくなるだけの気がする。
すみません。UNIONではどうしてもうまくいかなかったので、
ややこしくてもかまいませんので、ほかの方法を教えていただけないでしょうか?
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;
なぜか私のPCでは、MySQLでもSQLite2でも、正常に動作しませんでした。
参考にした本では、括弧()でくくればいいとも書かれていましたが、
やはりうまくいかず…。
XAMPP1.7.2を入れているのですが、これがマズいんでしょうか…
CASE文を使って以下のようにするのはどうでしょうか?
SELECT * FROM hoge WHERE name LIKE '%w%' ORDER BY (CASE WHEN name LIKE 'w%' THEN 0 ELSE 1 END), name ASC;
手元のSQLiteでは上手く動きました。
ただし大量データの場合のパフォーマンスがどうなるかは分かりませんが…。
こちらのMySQL、SQLiteでも問題なく動きました。
不勉強なため、CASE文の存在というものを知りませんでした。
教えていただいたSQLがどういう働きをしているのか
理解できるように勉強します。
ありがとうございました。
こちらのMySQL、SQLiteでも問題なく動きました。
不勉強なため、CASE文の存在というものを知りませんでした。
教えていただいたSQLがどういう働きをしているのか
理解できるように勉強します。
ありがとうございました。