RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
2012-12-09 09:36
609 查看
这次我们来讨论一下关于
对应的SQL查询是
查找所有优先级为3的未完成任务。
以上代码正常工作是没有问题的,可是如果想查找出所有优先级为
难道要生成如下的SQL查询码?
查询空值是生成了错误的SQL语句。
上面的查询不能工作,正确的写法应当是
我们期待的,正确语法的SQL语句是
从Rails1.2开始,可以通过传入hash作为查询条件来解决这个问题了。正确性由Rails来保证。
对应的SQL查询是
使用hash作为查询条件及生成的SQL查询
对应的SQL查询是
传入
使用动态字段查询方法
在《RailsCasts中文版,#2 Dynamic find_by Methods 使用动态的find_by方法进行查找操作》 曾经介绍过
对应的SQL查询是
作为结论,我们知道,为了保证生成正确格式的SQL查询语句,推荐使用hash格式的查询条件。
作者授权:Your welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.
原文链接:http://railscasts.com/episodes/15-fun-with-find-conditions
find方法查询条件的话题。以下是Rails Console输出的SQL查询语句。对应的动作是查找所有优先级为3的未完成任务。
>>Task.count(:all,:conditions=>["complete=? and priority=?,false,3]) =>2
对应的SQL查询是
SELECT count(*) AS count_all FROM tasks WHERE (complete=0 and priority=3);
查找所有优先级为3的未完成任务。
以上代码正常工作是没有问题的,可是如果想查找出所有优先级为
nil的任务呢?
Task.find(:all, :conditions > ["completed = ? AND priority = ?", false, nil])
难道要生成如下的SQL查询码?
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority = NULL);
查询空值是生成了错误的SQL语句。
上面的查询不能工作,正确的写法应当是
priority IS NULL,
priority = NULL。同理,当查找多个优先级的条件时应当使用
IN而不是
=,并且得用小括号扩这备选值以便满足SQL语法
Task.find(:all, :conditions > ["completed = ? AND priority IN (?)", false, [1,3]])
我们期待的,正确语法的SQL语句是
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority IN (1,3));
从Rails1.2开始,可以通过传入hash作为查询条件来解决这个问题了。正确性由Rails来保证。
Task.find(:all, :conditions > { :completed > false, priority > [1,3] }
对应的SQL查询是
SELECT * FROM "tasks" WHERE (completed = 'f' AND priority IN (1,3)
使用hash作为查询条件及生成的SQL查询
Task.find(:all, :conditions > {:completed > false, priority > 2..4})
对应的SQL查询是
SELECT * FROM "tasks" WHERE ("tasks"."priority" BETWEEN 2 AND 4 AND "tasks"."completed" = 'f');
传入
Range会被转换为
BETWEEN字句。
使用动态字段查询方法
在《RailsCasts中文版,#2 Dynamic find_by Methods 使用动态的find_by方法进行查找操作》 曾经介绍过
find_by方法。同样也支持hash和Range作为查询条件。
Task.find_by_priority(1..5)
对应的SQL查询是
SELECT * FROM "tasks" WHERE ("tasks"."priority" BETWEEN 1 AND 5) LIMIT 1;
作为结论,我们知道,为了保证生成正确格式的SQL查询语句,推荐使用hash格式的查询条件。
作者授权:Your welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.
原文链接:http://railscasts.com/episodes/15-fun-with-find-conditions
相关文章推荐
- RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
- sql With ROW_NUMBER() 使用 生成查询行号
- 巧用SQL的with语法生成临时结果集,进行查询与更新同步操作,解决高并发下对数据的重复访问
- RailsCasts中文版,#3 Find Through Association 使用级联查询
- 使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
- 或许你不知道的10条SQL技巧 原创 2017-07-16 58沈剑 架构师之路 这几天在写索引,想到一些有意思的TIPS,希望大家有收获。 一、一些常见的SQL实践 (1)负向条件查询不能使用索
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
- 使用自定义注解生成简单查询sql语句
- Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼
- 使用反射让linq实现动态查询, 类似拼接sql语句的where 条件
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
- YII2中使用with关联查询时,附带关联查询条件
- SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
- SQL使用in查询按条件顺序返回
- 关于sql查询字符char类型数据的条件使用
- 【MongoDB学习笔记15】MongoDB的查询:find查询条件
- Hibernate使用原生的动态sql实现带条件的查询分页功能
- sql 上一条、下一条记录再次改进(文章底部红色字体)及如何在子查询中使用limit语法!我这个脑子啊
- Error:Cause: failed to find target with hash string 'android-15'
- MongoDB小结15 - find【查询条件$ne】