2017-09-18 1 views
0

J'ai une requête MySQL que je construis en php mais que je veux déplacer dans une procédure stockée. Toute la requête est bonne pour passer dans le sproc, sauf pour une complication: En php, en fonction d'une condition, j'ajoute un "HAVING ......" comme dernière ligne. Est-il possible de faire une condition, un cas, etc. pour construire une requête d'une manière similaire?Affichage conditionnel d'une partie d'une requête dans une procédure stockée MySQL

Par exemple:

PROCEDURE `GeyMyItems`(
    IN query VARCHAR(100) 
    ) 
    BEGIN 
    SELECT * FROM my_table a 
    JOIN another_table b ON a.id = b.id 
    WHERE my_column = 'this_value' 

    IF (query = 'abc') 
     HAVING a.my_value = '123'; 

    END$$ 

DELIMITER ; 

Je sais la syntaxe du IF est probablement faux, mais je suis juste montrer ce que je suis en train de faire. Y a-t-il une meilleure manière de faire cela?

Le seul repli auquel je peux penser est peut-être de prendre soin de la partie HAVING en php. Ne l'incluez pas du tout dans le SQL, et quand je construis mon objet/tableau, je peux simplement filtrer là dans ma boucle while. Mais j'aimerais voir comment je peux utiliser une procédure stockée pour quelque chose comme ça, voire pas du tout?

Répondre

1

Si vous utilisez MySQL 5.0 et plus tard, c'est assez facile.

DELIMITER $$ 

CREATE PROCEDURE `GetMyItems`(
    IN query VARCHAR(100) 
    ) 
    BEGIN 
    -- Here you construct your SQL 
    SET @s = 'SELECT 1'; 

    IF query = 'abc' THEN 
     SET @s = CONCAT(@s, ',2'); 
    END IF; 

    -- Here you execute it.  
    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    END$$ 

DELIMITER ; 

Ceci était a similar question here.

+0

Oui, qui fait sens total. Construire les requêtes à travers des variables. Ensuite, exécutez-le à la fin. – KickingLettuce

0

à votre clause where ajouter ceci:

and 
(
(query = 'abc' and a.my_value ='123') 
or query <> 'abc' 
) 
+0

Fait sens pour les conditionnels faciles. – olegsv

+0

Pour indiquer le cas d'utilisation où la requête est nulle, vous devez utiliser "ou ifnull (query, '')! = 'Abc'". – slaakso