Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 重写SQL查询以在heroku上工作_Mysql_Ruby On Rails_Postgresql_Heroku - Fatal编程技术网

Mysql 重写SQL查询以在heroku上工作

Mysql 重写SQL查询以在heroku上工作,mysql,ruby-on-rails,postgresql,heroku,Mysql,Ruby On Rails,Postgresql,Heroku,如何重写rails查询以在Heroku(Portegres)上运行 我也遇到了这个问题。Postgres对LIKE操作符是区分大小写的,所以下面是我在一个项目中所做的。另外,我不喜欢在本地运行postgres,所以我让它在开发中使用like(mysql/sqlite),在生产中使用ILIKE(postgres)。ILIKE是“不区分大小写的like” /config/environment.rb DATABASE_OPERATOR = { :like_operator => "

如何重写rails查询以在Heroku(Portegres)上运行


我也遇到了这个问题。Postgres对LIKE操作符是区分大小写的,所以下面是我在一个项目中所做的。另外,我不喜欢在本地运行postgres,所以我让它在开发中使用like(mysql/sqlite),在生产中使用ILIKE(postgres)。ILIKE是“不区分大小写的like”

/config/environment.rb

  DATABASE_OPERATOR = {
    :like_operator => "LIKE"
  }
/config/environments/production.rb

  DATABASE_OPERATOR = {
    :like_operator => 'ILIKE' #postgres awfulness
  }
质疑


使用管道| |代替CONCAT,这是标准SQL:

@students = Student.find(:all, :conditions => ['(first_name || last_name LIKE ?) OR (first_name || middle_names || last_name LIKE ?)', "%#{params[:search]}%", "%#{params[:search]}%"])
同时检查引号,字符串需要单引号,数据库对象需要双引号。MySQL同时接受这两种引号,根据配置,其他数据库只接受标准引号。

使用以下命令

Student.find(:all, 
                  :conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
                                  (concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
                                 {:text=>"%#{params[:search]}%"]
                        )

使用
concat()
没有任何意义@Frank的答案很接近,但逻辑是错误的

where(first_name | last_name LIKE?)
计算结果为

“其中,
计算结果为
其中,
包含搜索词”

这会让你得到预期的结果

Student.all(
  :conditions => ["
    first_name like :search ||
    last_name like :search  ||
    middle_names like :search
    ",
    {:search => "%#{params[:search]}%"}
  ]
)

这将匹配
学生
表中在其姓名的任何部分都有
参数[:search]
的所有行。

(名字| |姓氏类似?)
将只返回
%search%
中存在
姓氏的行。根据一些论坛帖子,mySQL中| |的行为是非标准的,而pg中是concat。这是怎么回事"? 只是不一样。嘿,我可以有一个意见。就是这样:如果大多数其他数据库都对“like”进行不区分大小写的搜索,那么就这样做吧。如果你真的想区分大小写,让我用一个特殊的命令来搜索它。虽然这对我的问题没有帮助,但知道这一点很好。我会用伊利克谢谢你-救了我的命!但是,如果查询字符串包含,例如他们的名字和姓氏,该怎么办。在这种情况下,我的mySQL代码会找到它们,但是你的代码会失败。你到底遇到了什么问题?
Student.find(:all, 
                  :conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
                                  (concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
                                 {:text=>"%#{params[:search]}%"]
                        )
Student.all(
  :conditions => ["
    first_name like :search ||
    last_name like :search  ||
    middle_names like :search
    ",
    {:search => "%#{params[:search]}%"}
  ]
)