Stored procedures MySQL,存储函数,使用字符串变量作为查询

Stored procedures MySQL,存储函数,使用字符串变量作为查询,stored-procedures,mysql,stored-functions,Stored Procedures,Mysql,Stored Functions,我想知道,在mysql存储函数或存储过程中,是否可以将mysql查询作为字符串变量组成,以便稍后执行?我有一个存储函数get_district_part((district_id INT,country_id INT,city_id INT,zip_id INT))返回INT,该函数引用以下表格: CREATE TABLE IF NOT EXISTS `modx`.covereage_district_part( id INT NOT NULL AUTO_INCR

我想知道,在mysql存储函数或存储过程中,是否可以将mysql查询作为字符串变量组成,以便稍后执行?我有一个存储函数
get_district_part((district_id INT,country_id INT,city_id INT,zip_id INT))返回INT
,该函数引用以下表格:

CREATE TABLE IF NOT EXISTS `modx`.covereage_district_part(
    id      INT     NOT NULL    AUTO_INCREMENT  PRIMARY KEY,
    districtID  INT     NOT NULL,
    countyID    INT,
    cityID      INT,
    zipID       INT,
    FOREIGN KEY (districtID) REFERENCES `modx`.coverage_district (id),
    FOREIGN KEY (countyID) REFERENCES `modx`.coverage_county (id),
    FOREIGN KEY (cityID) REFERENCES `modx`.coverage_city (id),
    FOREIGN KEY (zipID) REFERENCES `modx`.coverage_zip (id)
);
get\u distct\u part
用于返回与
district\u id
匹配的行的id,以及
country\u id
city\u id
zip\u id
的一些组合。问题是我想返回与id的精确组合匹配的行的id,而不是包含这些想法的行的id。要做到这一点,我希望对查询语句进行分段,以便它是针对所提供的ID构建的。如果可以的话,我试图不必匹配空值

我意识到使用PHP可以很容易地做到这一点,但如果没有其他原因,我希望将其作为mysql存储进程来完成,那么用于此的所有其他函数都是存储进程。

是的,可以将字符串作为动态SQL存储在存储过程中

delimiter //
CREATE PROCEDURE get_district_part (district_id INT, county_id INT, city_id INT, zip_id INT)
BEGIN
  SET @query = 'SELECT id FROM covereage_district_part WHERE 1=1';

  IF (district_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND districtID=', district_id);
  END IF;

  IF (county_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND countyID=', county_id);
  END IF;

  IF (city_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND cityID=', city_id);
  END IF;

  IF (zip_id IS NOT NULL) THEN
    SET @query = CONCAT(@query, ' AND zipID=', zip_id);
  END IF;

  PREPARE stmt1 FROM @query;

  EXECUTE stmt1;
END //
delimiter ;

call get_district_part(1,1,1,1);
call get_district_part(1,1,null,null);

注意:但是,您不能在存储函数中执行动态SQL。您的问题提到使用
返回
子句声明例程,这将是一个存储函数。

我已经看过
准备
语句,我将不得不花更多时间在它上面。谢谢,这非常有用。您能从
@query
查询中引用参数吗?我试过了,但得到一个未知列错误。没关系。我只是想我可以像上面那样附加实际值。