2017-02-08 9 views
0

전 완전히 저장 프로 시저를 사용하고있어 기본 개념을 이해하려고합니다. 이것은 나의 첫 번째 것이며, 물론 잘못된 것이 있습니다.MySql 저장 프로 시저 매개 변수에 따라 WHERE "variabilised"

기본적으로 쿼리는 동일하며 (원본은 더 복잡하고 다른 작업이 있지만) 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

동적 쿼리 검사를 생성하려면 [**이 ** (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;