Ich habe zwei Programme, die fast identisch aussehen. Eine Person erhält Standort und Preis und führt die Operation durch, die andere Person erhält Erfahrung und Preis. < /p>
Erstes:
-- Returns: service providers in given location and price DELIMITER && CREATE PROCEDURE get_service_providers_location_price (IN id_location INT,IN price DOUBLE,IN limite INT, IN inicio INT) BEGIN SELECT user.idUser, user.name,user.lastActivity,user.active,serviceprovider.description,location.name AS location, location.cordsX, location.cordsY, file.image FROM user INNER JOIN location ON user.idLocation = location.idLocation INNER JOIN file ON user.idUser = file.idUser INNER JOIN serviceprovider ON user.idUser = serviceprovider.idSP INNER JOIN category_has_serviceprovider ON serviceprovider.idSP = category_has_serviceprovider.idServiceProvider WHERE user.type = 3 AND user.idLocation = id_location AND (category_has_serviceprovider.price <= price OR category_has_serviceprovider.price IS NULL) and serviceprovider.idSubscription != 1 ORDER BY CASE WHEN serviceprovider.idSubscription in (5,6,7) then 1 else 2 end, serviceprovider.endSub ASC LIMIT limite OFFSET inicio; END && DELIMITER ;
Zweitens:
-- Returns: service providers in given experience and price DELIMITER && CREATE PROCEDURE get_service_providers_experience_price (IN experience INT, IN price DOUBLE,IN limite INT, IN inicio INT) BEGIN SELECT user.idUser, user.name,user.lastActivity,user.active,serviceprovider.description,location.name AS location, location.cordsX, location.cordsY, file.image FROM user INNER JOIN location ON user.idLocation = location.idLocation INNER JOIN file ON user.idUser = file.idUser INNER JOIN serviceprovider ON user.idUser = serviceprovider.idSP INNER JOIN category_has_serviceprovider ON serviceprovider.idSP = category_has_serviceprovider.idServiceProvider WHERE user.type = 3 AND (category_has_serviceprovider.price <= price OR category_has_serviceprovider.price IS NULL) AND category_has_serviceprovider.experience >= experience and serviceprovider.idSubscription != 1 ORDER BY CASE WHEN serviceprovider.idSubscription in (5,6,7) then 1 else 2 end, serviceprovider.endSub ASC LIMIT limite OFFSET inicio; END && DELIMITER ;
Wie Sie sehen können, hat sich nur die WHERE-Klausel geändert. Ist es in MySQL möglich, diese beiden Prozeduren zu einer zusammenzufassen? Weil ich ungefähr fünf Programme habe, die gleich aussehen, sich aber nur ändern WHERE-Klausel finde ich es ärgerlich, für jeden Fall einen separaten Prozess durchzuführen.
您可以使用 IFNULL。传递
experience
或id_location
值并使用NULL
作为另一个值。为参数制定命名方案(此处为
in_
-prefix)也是一个好习惯,以便参数与列名称不同。例如,您可以使用这个:
如果提供
IN 经验 INT
设置为某个值,则应用它的条件。如果您为此参数提供 NULL,则应用IN id_location INT
的条件。注意 - 现在你的 SP 有 5 个参数,而不是 4 个。
PS。您的 SP 包含一条 SQL 语句 - 因此不需要 BEGIN-END 和 DELIMITER。PPS。使用类似的方法,您可以创建 SP,它可以同时应用其中一个条件,也可以同时应用这两个条件,或者都不应用。例如,它可以是:
购买力平价。如果您想要有 2 个独立的函数但有一份代码副本(例如,这些函数名称已在一堆代码中使用),那么您可以这样做: