我有这样的代码。
DELIMITER $$
CREATE PROCEDURE `sp_deleteOrderData`(orderid BIGINT(11))
BEGIN
DECLARE shipmentnumbers VARCHAR(1000);
DECLARE cartonid VARCHAR(1000);
SELECT GROUP_CONCAT(a_shipmentid) FROM t_shipment WHERE a_orderid = orderid INTO shipmentnumbers;
SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE a_shipmentid IN (shipmentnumbers) INTO cartonid;
SELECT shipmentnumbers;
/*SELECT cartonid; */
END$$
DELIMITER ;
此处 shipmentnumbers 返回 100020,100021,100022
理想情况下,cartonid 应返回为 11,12,13
但我只得到 11 个 cartonid。
但是当我使用下面的代码时,我得到了正确的结果。
SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE FIND_IN_SET( a_shipmentid, shipmentnumbers ) INTO cartonid;
我想知道 IN 和 FIND_IN_SET 之间到底有什么区别,以及我如何决定使用什么。
最佳答案
IN
接受要搜索的列表或参数,FIND_IN_SET
接受包含逗号分隔列表的字符串参数:
SELECT 1 IN (1, 2, 3, 4)
SELECT FIND_IN_SET(1, '1,2,3,4')
如果您尝试将 IN
应用于逗号分隔的字符串,它会将其视为单个参数并将其作为一个整体进行匹配:
SELECT 1 IN ('1,2,3,4')
当然,字符串 '1'
不等于字符串 '1,2,3,4'
所以上面的查询返回 false。
关于mysql - 为什么 find_in_set 有效但 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15656740/