find_by_sql 返回值问题

本文分享了使用Ruby on Rails进行数据库查询的经验,特别是find方法与find_by_sql的区别。find方法返回的是类的集合,可以直接调用类属性;而find_by_sql返回的对象只包含所检索的字段。

最近在做一个公司内部的系统,因为ROR开发速度较快,所以就用了它,后面会纪录一些开发的经验上来。

在用find方法执行查询的时候,返回值肯定是一个类的集合(Array),这时候可以直接调用类的属性,但是在用find_by_sql的时候,例如,下面的sql语句:sql = "SELECT (TO_DAYS(FINISH_DATE) - TO_DAYS(START_DATE)) AS DAYS,(TO_DAYS(NOW()) - TO_DAYS(START_DATE)) AS DAYS_PASS FROM MILESTONE_ITEMS WHERE ID = " + id.to_s
返回的对象中类型虽然还是原来的类,但是就只有DAYS和DAYS_PASS两个属性了,因为Rails好像是用检索的字段来填充返回对象的。不知道这样理解对不对,有空再研究吧。 

<think>好的,用户想了解如何在SQL中使用FIND_IN_SET函数,并且需要示例教程。首先,我需要回顾一下FIND_IN_SET的基本用法和适用场景。根据引用[1]和[4],这个函数主要用于在逗号分隔的字符串列表中查找特定值的位置。它的语法是FIND_IN_SET(要查找的值, 字段名),返回的是该值在列表中的位置索引,如果不存在则返回0。 接下来,用户可能需要具体的示例来理解如何应用。引用[2]和[3]提供了实际的使用场景,比如查询部门祖先字段中包含某个部门ID的情况。这时候需要区分FIND_IN_SET和IN、LIKE的区别,避免用户混淆。例如,IN适用于确定的值列表,而FIND_IN_SET处理的是逗号分隔的字符串。LIKE可能会导致错误的匹配,比如部分匹配的问题。 然后,我需要考虑如何组织这些信息,使其结构清晰。按照用户的要求,分步骤说明使用场景和示例会比较合适。可能需要包括基本语法、典型应用案例、与IN和LIKE的区别,以及注意事项等内容。此外,引用[5]提到了替换函数的问题,虽然用户当前的问题不涉及替换,但可以作为相关知识点提及,或者留在相关问题中。 还要注意用户提供的引用中有几个示例,比如在sys_dept表中查询ancestors字段包含101的部门。这个例子可以具体展开,展示SQL语句和结果,帮助用户直观理解。同时,需要强调性能方面的注意事项,如引用[4]提到的,FIND_IN_SET可能在数据量大时效率不高,建议在适当场景使用。 最后,生成相关问题时要围绕FIND_IN_SET的替代方案、性能优化、与其它函数的对比等,这样用户如果有进一步疑问,可以自行探索。需要确保所有示例的LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及代码块较多,需要注意语法高亮和正确性。 总结步骤: 1. 介绍函数的基本作用和语法。 2. 提供基础使用示例,如查询包含特定值的记录。 3. 展示实际应用案例,比如部门查询。 4. 对比FIND_IN_SET与IN、LIKE的区别,避免误用。 5. 提及使用中的注意事项,如性能问题和适用场景。 6. 生成相关问题,引导深入学习。</think>### FIND_IN_SET函数应用方法及示例教程 #### 一、基本语法与作用 `FIND_IN_SET(value, column)` 函数用于在**逗号分隔的字符串列表**中查找特定值的位置。 - **返回值**:若存在则返回位置索引(从1开始),否则返回0[^1][^3]。 - **适用场景**:处理标签、分类、权限等多值字段的查询,例如 `ancestors='101,102,103'`[^4]。 #### 二、基础使用示例 ##### 示例1:查询包含特定值的记录 假设表 `TEST` 中字段 `list` 存储逗号分隔的字符串(如 `'AA,BB,CC'`),查询包含 `'AA'` 的记录: ```sql SELECT id, list FROM TEST WHERE FIND_IN_SET('AA', list) > 0; ``` **结果**: | id | list | |----|-----------| | 1 | AA,BB,CC | | 3 | AA,DD | [^3] ##### 示例2:部门层级查询(实际应用) 表 `sys_dept` 存储部门信息,字段 `ancestors` 记录上级部门ID(如 `'101,102'`)。查询所有祖先包含 `101` 的部门: ```sql SELECT dept_id, ancestors FROM sys_dept WHERE FIND_IN_SET('101', ancestors) > 0; ``` **结果**: | dept_id | ancestors | |---------|------------| | 102 | 101,100 | | 103 | 101,102 | [^2] #### 三、与 `IN` 和 `LIKE` 的区别 1. **`IN` 的局限性** `IN` 适用于明确的值列表,但无法直接处理逗号分隔的字符串: ```sql -- 错误用法:无法匹配 '101,102' SELECT * FROM sys_dept WHERE '101' IN ('101,102'); -- 正确应使用 FIND_IN_SET ``` 2. **`LIKE` 的模糊匹配问题** `LIKE` 可能导致部分匹配错误: ```sql -- 错误匹配到 '1010' 或 '10100' SELECT * FROM sys_dept WHERE ancestors LIKE '%101%'; ``` #### 四、注意事项 1. **性能问题** `FIND_IN_SET` 会触发全表扫描,数据量大时效率低,建议仅在必要时使用[^4]。 2. **数据格式要求** 字段必须是**严格逗号分隔**的字符串,如 `'A,B,C'`,不可含空格或其他符号。 #### 五、进阶用法 ##### 联合其他函数排序 按 `list` 中 `'BB'` 的位置排序: ```sql SELECT id, list FROM TEST ORDER BY FIND_IN_SET('BB', list); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值