【问题标题】:Why find_in_set works but IN clause为什么 find_in_set 有效但 IN 子句
【发布时间】:2013-03-27 10:33:50
【问题描述】:

我有这样的代码。

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 ;

这里 shippingnumbers 返回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 之间到底有什么区别,我决定使用什么。

【问题讨论】:

    标签: mysql sql select


    【解决方案1】:

    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。

    【讨论】:

    • 这个SELECT FIND_IN_SET("abc", 'abc','abd','asr','asd') 怎么样?这行得通吗?
    【解决方案2】:

    FIND_IN_SET 在以逗号分隔的一组字符串中搜索一个字符串。

    但是您不需要使用GROUP_CONCAT 来连接要在IN 子句中使用的行,试试这个,

    SELECT  GROUP_CONCAT(a_cartonid) 
    FROM    t_carton
    WHERE   a_shipmentid IN
             (
                SELECT a_shipmentid
                FROM t_shipment 
                WHERE a_orderid = orderid
             )
    

    或使用JOIN

    SELECT  GROUP_CONCAT(DISTINCT a.a_cartonid) 
    FROM    t_carton a
            INNER JOIN
            (
                SELECT a_shipmentid
                FROM t_shipment 
                WHERE a_orderid = orderid
            ) b ON a.a_shipmentid = b.a_shipmentid
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多