2017-02-08 20 views
0

Я совершенно новый с хранимой процедурой, и я пытаюсь понять ее основные понятия. Это мой первый и, конечно, что-то не так.MySql Сохраненная процедура WHERE «variabilised» в соответствии с параметром

В принципе, запрос будет таким же (оригинал более сложный и есть другие операции), но предложение WHERE изменяется в соответствии с параметром selType. Так что я пытаюсь сделать, это своего рода «вариализация» предложения 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;