SQLでNULLの検索や除外
SQLではWHERE句で検索条件を指定しますが、その際にNULLを扱う場合について調べました
というのも、普通に
SELECT * FROM users WHERE clm = NULL
だと取り出せません
SELECT * FROM users WHERE clm IS NULL
とすることで取り出せます(否定はIS NOT NUL)
SQLではWHERE句で検索条件を指定しますが、その際にNULLを扱う場合について調べました
というのも、普通に
SELECT * FROM users WHERE clm = NULL
だと取り出せません
SELECT * FROM users WHERE clm IS NULL
とすることで取り出せます(否定はIS NOT NUL)
今までwordは1つで複数のフィールドを検索するときは
...WHERE (`field1` LIKE '%word%') OR (`field2` LIKE '%word%') OR...
という感じにしており、冗長な気がしてなりませんでした;
...WHERE (`field1` || `field2`) LIKE '%word%' ...
一度このようにしてやってみたのですが上手くいきませんでした
どちらのfieldも内容があれば上手くいくので最初は勘違いしていましたが、この場合、どちらかのfieldがnullならその行の検索が失敗してしまいます(例え片方のfieldがマッチしていても)
...WHERE (IFNULL(`field1`, '') || IFNULL(`field2`, '')) LIKE '%word%' ...
こうするとfieldがnullの場合に”(空文字列)が返るのでそのまま検索出来ます
まだ多少冗長な気がしないでもないですが、前よりはマシになったと思います
DISTINCTというコマンドを使います
例えばtwitterのようなサービスで全体の発言から直近10人のユーザIDを抜き出す場合、
SELECT DISTINCT `user_id` FROM `statuses` ORDER BY `created_at` DESC LIMIT 10
といった具合です
Railsの問題ではないのでカテゴリおかしいけど…
find_by_sqlというメソッドでSQL文叩いたときの失敗
find_by_*とかだと:conditionsに配列を渡すと自動的にSQLのwhere文になるよう処理してくれるんだけど、
find_by_sqlは直でSQL書かなきゃいけないので単に配列渡してもエラーになる
そこで@users.map{|u|u.id}.join(‘ OR ‘)とかやってwhereの部分作ったんだけど…
["SELECT * FROM posts WHERE user_id = ?", @users.map{|u|u.id}.join(' OR ')]
XSS対策でこのようにやってて、@usersが2人以上だとエラーになるという現象に遭遇
なぜエラーになるかというと、この書き方だと「?」が「@users〜」と置き換わるんだけど、この時強制的に(?)文字列にされてしまう
つまり、1 OR 2 OR 3とかの条件文も’1 OR 2 OR 3′という文字列になってしまい、そんなuser_idはないので検索結果が0件なのでした
1人の場合は正常なので中々分からなかった;
(文字列型でも数字だけだと自動で型キャストされて検索出来てしまう模様;)
長々と書いたけど現状はこんな感じ

背景が薄い灰色の行がブックマーク、他がつぶやき
ブックマーク部分はまだURLを登録出来るだけなのでタグとかに対応させたい