2013-03-27 61 views
3

我有這樣的代碼。爲什麼find_in_set有效,但IN子句

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究竟有什麼區別,我決定使用什麼。

回答

2

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。

+0

這個怎麼樣 'SELECT FIND_IN_SET(「abc」,'abc','abd','asr','asd')'?這將工作正確嗎? – Unbreakable 2017-02-09 17:38:57

1

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 
相關問題