我有这样的代码。
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 ;
此处退回货件编号100020,100021,100022 理想情况下,应将cartonid返回为11,12,13
100020,100021,100022
11,12,13
但是我只得到11作为肉毒杆菌素。
但是,当我使用下面的代码时,我会得到正确的结果。
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接受包含以逗号分隔的列表的字符串参数:
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。
'1'
'1,2,3,4'