railsで各RDBMSの文字列連結に対応させる

問題点

sqliteでは問題なく動作するのに、mysqlで実行すると検索結果が0件になる。

問題のSQL

SELECT "users".*
FROM "users"
  INNER JOIN "profiles"
  ON ("profiles"."user_id" = "users"."id")
WHERE (last_name || first_name LIKE '%井川%')
ORDER BY created_at desc

原因

どうやらMysqlでは文字連結に「||」は使用できないらしい。
concatで文字連結する必要があるようだ。
concat( last_name, first_name ) LIKE ‘%井川%’

ただし、次のように変更すると、sqliteで実行するとエラーになる。 あ~困った!!

対応内容

Mysql,sqlite,oracle,sqlServerすべてに対応するため、次のように修正してみる。

config/initializers/配下に、次のファイルを配備

呼び出し側

実装前

scope :name_search, lambda{|name| where ('last_name' || 'first_name') LIKE ?", "%#{name}%" }

実装後

scope :name_search, lambda{|name| where("#{connection.concat('last_name', 'first_name')} LIKE ?", "%#{name}%") }

以上で、実装終了!!

comments powered by Disqus