我在本地开发中运行MySQL数据库,但是部署到使用Postgres的Heroku时遇到了问题。 Heroku几乎处理所有内容,但是我的不区分大小写的Like语句变成了区分大小写。 我可以使用iLike语句,但是我的本地MySQL数据库无法处理。
有没有一种最佳方法编写不区分大小写的查询,可以兼容MySQL和Postgres?还是我需要根据我的应用程序连接的数据库编写单独的Like和iLike语句?
我在本地开发中运行MySQL数据库,但是部署到使用Postgres的Heroku时遇到了问题。 Heroku几乎处理所有内容,但是我的不区分大小写的Like语句变成了区分大小写。 我可以使用iLike语句,但是我的本地MySQL数据库无法处理。
有没有一种最佳方法编写不区分大小写的查询,可以兼容MySQL和Postgres?还是我需要根据我的应用程序连接的数据库编写单独的Like和iLike语句?
select * from foo where upper(bar) = upper(?);
如果在调用者中将参数设置为大写,您可以避免第二个函数调用。
upper(bar)
上创建一个索引:http://www.postgresql.org/docs/current/interactive/sql-createindex.html - mu is too shortwhere("UPPER(bar) = ?", parameter.upcase)
- scarver2使用 Arel:
Author.where(Author.arel_table[:name].matches("%foo%"))
matches
将使用Postgres的ILIKE
运算符,而对于其他情况则使用LIKE
。
在Postgres中,你可以这样做:
SELECT whatever FROM mytable WHERE something ILIKE 'match this';
我不确定MySQL是否有等效的方法,但你可以这样做,虽然比较丑陋,但在MySQL和PostgreSQL中都应该有效:
SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');
正则表达式是大小写不敏感的(除非与BINARY一起使用),可以像这样使用...
SELECT id FROM person WHERE name REGEXP 'john';
...匹配'John'、'JOHN'、'john'等。
Select * from table where column ~* 'UnEvEn TeXt';
Select * from table where column ~ 'Uneven text';
两者都会匹配 "Some Uneven text here" 只有前者才会匹配 "Some UNEVEN TEXT here"