2016-04-18 36 views
0

在我的代碼中,我將一個字符串變量('4,5,6')傳遞給從此字符串爆炸的存儲過程(4,5,6-Name )。我在存儲過程中使用IN子句,並且我知道IN子句接受('4','5','6')或簡單地(4,5,6)這種類型的數據,但我無法在我的存儲過程。如果還有其他方法可以幫助我,請幫助我。如何在存儲過程中的IN子句中使用字符串mysql

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15)) 

SELECT 
     * 
     FROM 
     tbl_transfer 
     WHERE 
     tbl_transfer.siteNameID IN (siteid) AND (tbl_transfer.paymentDate BETWEEN datefrom AND dateto); 
+0

請告訴我的'價值site_id' –

+0

@Uchiha其實我爆炸的字符串(4,5,6-anyname),並具有分解它「 - 」分隔符,並希望在IN子句中使用第一個值(4,5,6),但是當我在php中檢查類型時,它顯示一個字符串,因此我無法在存儲過程的IN子句中使用 – Paramjeet

+0

請參閱此處動態創建和執行查詢字符串http://stackoverflow.com/questions/8549619/mysql-dynamically-build-query-string-in-a-stored-procedure-based-on-logic。您需要在傳遞的參數中添加周圍的單引號。 – PaulF

回答

0

您是否嘗試過這樣的事情,我給你的鏈接 - 創建整個查詢作爲一個字符串&然後執行一個準備好的聲明:

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15)) 

Set @query = CONCAT("SELECT * FROM tbl_transfer WHERE tbl_transfer.siteNameID IN (", siteid, ") AND (tbl_transfer.paymentDate BETWEEN ", datefrom, " AND ", dateto, ")"; 

PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

如果你想單引號版本你可以使用這個:

Set @query = CONCAT("SELECT * FROM tbl_transfer WHERE tbl_transfer.siteNameID IN ('", REPLACE(siteid,",", "','"), "') AND (tbl_transfer.paymentDate BETWEEN ", datefrom, " AND ", dateto, ")"; 
+0

感謝PaulF,查詢運行完美,但我也發現了一種方法,它也給出了我想要的輸出。但非常感謝你的努力 – Paramjeet

0

此代碼也工作正常。我用FIND_IN_SET功能:

FIND_IN_SET(tbl_transfer.siteNameID, siteid) 

全碼:

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15)) 

SELECT 
    * 
    FROM 
    tbl_transfer 
    WHERE 
FIND_IN_SET(tbl_transfer.siteNameID, siteid) AND (tbl_transfer.paymentDate BETWEEN datefrom AND dateto); 
相關問題