FIND_IN_SET() vs IN(), StackOverFlow上的一个问题
通过一个实例简述数据库查询里FIND_IN_SET() 和IN()区别
问题:
数据库中有两个表: Orders 和 Companies
Orders的表结构:
OrderID | attachedCompanyIDs ------------------------------------ 1 1,2,3 2 2,4
Campany表结构:
CompanyID | name -------------------------------------- 1 Company 1 2 Another Company 3 StackOverflow 4 Nothing
想要查询的数据为: ID为1的order对应的全部Company的名字.
楼主给出两种查询方式:
第一种:
SELECT name FROM orders,company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)工作正常. 查询结果如下:
name --------------- Company 1 Another Company StackOverflow
第二种:
SELECT name FROM orders,company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)出现问题, 查询结果如下:
name --------------- Company 1 Another Company StackOverflow
作何解释?
答案:
使用关键字IN时, 会自动对值的类型进行转换, 然后在进行操作. 在上面的情况中SELECT name FROM orders,company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
attachedCompanyIDs 的值将被转化成INT (也就是CompanyID的类型), 所以这里字符串"1,2,3"在转换过程中会变成1(到第一个非数字位停止转换). 因此,
companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1)
SELECT name FROM orders JOIN company ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[]) WHERE orderID = 1但是MySQL暂不支持. 你可以在这个链接里面找到一些有趣的文章:
原文地址: http://stackoverflow.com/questions/4155873/find-in-set-vs-in