2017-02-08 3 views
0

私は完全にストアドプロシージャが新しく、その基本的な概念を理解しようとしています。これは私の最初のものですが、もちろん間違ったことがあります。MySqlストアドプロシージャWHEREパラメータに応じて「可変」

基本的にクエリは同じです(元のものはより複雑で、他の操作もあります)が、WHERE句はselTypeパラメータに従って変更されます。だから、私がしようとしているのは、param値に従ってWHERE句の一種の「可変」です。 これは正しいアプローチであるかどうかわかりませんが、そうであれば何が問題なのですか。

DELIMITER // 

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN) 
BEGIN 
DECLARE whereUserCriteria VARCHAR(127); 
IF selType = 1 THEN 
    SET whereUserCriteria = CONCAT('address_id = ', addressId); 
ELSE 
    SET whereUserCriteria = 'address_id = 1'; 
END IF; 

SELECT whatever 
FROM wherever AS ad 
WHERE whereUserCriteria ; 

END // 

それは動作を停止し、それはvariabilisedいないとき、私はそれをダイナミックにするために変数を使用すると、それはできるだけ早く、完璧に動作しますが、ことを見てうれしいです。 もちろん、これは、このような場合に最良のアプローチが何であるかを理解することを目的とした単なる例です。

+0

[** this **](http://stackoverflow.com/a/5728155/3470178)を作成したい場合は、次のようにします。 –

答えて

2

あなたが一緒にクエリと条件を連結クエリを準備し、準備を使用して文を実行することを実行することができます

DELIMITER // 

CREATE PROCEDURE `testProcedure` (IN addressId INT, IN selType BOOLEAN) 
BEGIN 
DECLARE whereUserCriteria VARCHAR(127); 
IF selType = 1 THEN 
    SET whereUserCriteria = CONCAT('address_id = ', addressId); 
ELSE 
    SET whereUserCriteria = 'address_id = 1'; 
END IF; 

SET @myQuery = ''; 
SET @myQuery = CONCAT("SELECT whatever FROM wherever AS ad 
WHERE ",whereUserCriteria,") ; 
PREPARE stmQuery FROM @myQuery; 
EXECUTE stmQuery; 
DEALLOCATE PREPARE stmQuery; 

END // 

DELIMITER ; 
0

おそらく動的クエリを実行する必要があります。

しかし、あなたは(それはあなたが望むものであるかどうかわからなく)このようCASEを使用して、サンプルを書き換えることができます。

SELECT whatever 
FROM wherever AS ad 
WHERE address_id = CASE WHEN selType = 1 
         THEN addressId 
         ELSE 1 
        END; 
関連する問題