Archive

Posts Tagged ‘sql’

SQLでNULLの検索や除外

7月 30th, 2009

SQLではWHERE句で検索条件を指定しますが、その際にNULLを扱う場合について調べました
というのも、普通に

SQL:
  1. SELECT * FROM users WHERE clm = NULL

だと取り出せません

SQL:
  1. SELECT * FROM users WHERE clm IS NULL

とすることで取り出せます(否定はIS NOT NUL)

SQLでLIKE文をまとめる

12月 24th, 2008

今まで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の場合に''(空文字列)が返るのでそのまま検索出来ます
まだ多少冗長な気がしないでもないですが、前よりはマシになったと思います

重複しないようにカラムを抜き出すSQL

12月 14th, 2008

DISTINCTというコマンドを使います
例えばtwitterのようなサービスで全体の発言から直近10人のユーザIDを抜き出す場合、

SQL:
  1. SELECT DISTINCT `user_id` FROM `statuses` ORDER BY `created_at` DESC LIMIT 10

といった具合です

SQL文で嵌まった

10月 3rd, 2008

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を登録出来るだけなのでタグとかに対応させたい