首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带参数的存储过程

问带参数的存储过程
EN

Stack Overflow用户
提问于 2020-07-25 01:13:15
回答 3查看 25关注 0票数 1

如何在过滤SELECT结果前增加对参数的IF NOT NULL检查?我尝试了在SE上找到的各种变体,但似乎都不适合我,IF() - THEN - END IF ...使用MariaDB,是否有不同的符号?

代码语言:javascript
复制
DELIMITER //
CREATE PROCEDURE IzvjestajRacuna (
    IN p_DatumOd DATETIME,
    IN p_DatumDo DATETIME,
    in p_ArtiklID INTEGER,
    IN p_PoslovnicaID INTEGER,
    IN p_KupacID INTEGER,
    IN p_RadnikID INTEGER
)
BEGIN
    SELECT Racun.* FROM Racun
    INNER JOIN RacunStavka ON Racun.RacunID=RacunStavka.RacunID
        AND RacunStavka.ArtiklID=p_ArtiklID
        AND Racun.KupacID=p_KupacID
        AND Racun.RadnikID=p_RadnikID
    INNER JOIN Radnik on Racun.RadnikID = Radnik.RadnikID
        AND Radnik.PoslovnicaID=p_PoslovnicaID
    WHERE CAST(Racun.DatumVrijeme AS date) >= p_DatumOd
      AND CAST(Racun.DatumVrijeme AS date) <= p_DatumDo;
END //

DELIMITER ;


call IzvjestajRacuna('2020-02-22','2020-02-25', 15, 25, 9, 35);
call IzvjestajRacuna(null, null, 15, 25, 9, 35);
EN

回答 3

Stack Overflow用户

发布于 2020-07-25 01:30:27

您可以在过程中使用预准备语句。

这是一个更新的SQL。

代码语言:javascript
复制
DELIMITER //
CREATE PROCEDURE IzvjestajRacuna (
    IN p_DatumOd DATETIME,
    IN p_DatumDo DATETIME,
    IN p_ArtiklID INTEGER,
    IN p_PoslovnicaID INTEGER,
    IN p_KupacID INTEGER,
    IN p_RadnikID INTEGER
)
BEGIN
    -- Assumed that if a parameter is null, we would find rows with null value on date column.
    SET @where1 = IF(p_DatumOd IS NULL, " AND CAST(Racun.DatumVrijeme AS date) IS NULL", CONCAT(" AND CAST(Racun.DatumVrijeme AS date) >= ", p_DatumOd));
    SET @where2 = IF(p_DatumDo IS NULL, " AND CAST(Racun.DatumVrijeme AS date) IS NULL", CONCAT(" AND CAST(Racun.DatumVrijeme AS date) <= ", p_DatumDo));
    
    SET @sql_query = CONCAT(
        "
            SELECT Racun.* FROM Racun
            INNER JOIN RacunStavka ON Racun.RacunID=RacunStavka.RacunID
                AND RacunStavka.ArtiklID=p_ArtiklID
                AND Racun.KupacID=p_KupacID
                AND Racun.RadnikID=p_RadnikID
            INNER JOIN Radnik ON Racun.RadnikID = Radnik.RadnikID
                AND Radnik.PoslovnicaID=p_PoslovnicaID
            WHERE TRUE
        ", @where1, @where2        
    ) ;
    PREPARE stmt FROM @sql_query ;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt ;
END //

DELIMITER ;
票数 0
EN

Stack Overflow用户

发布于 2020-07-25 05:15:37

如果您的列确实有值,则可以使用ifnull。

代码语言:javascript
复制
CREATE PROCEDURE IzvjestajRacuna (
p_DatumOd DATETIME,
p_DatumDo DATETIME,
p_ArtiklID INTEGER,
p_PoslovnicaID INTEGER,
p_KupacID INTEGER,
p_RadnikID INTEGER
)
BEGIN

SELECT Racun.* 
FROM Racun
  INNER JOIN RacunStavka ON Racun.RacunID=RacunStavka.RacunID
    AND RacunStavka.ArtiklID=ifnull(p_ArtiklID, RacunStavka.ArtiklID)
    AND Racun.KupacID=ifnull(p_KupacID, Racun.KupacID)
    AND Racun.RadnikID=ifnull(p_RadnikID, Racun.RadnikID)
  INNER JOIN Radnik on Racun.RadnikID = Radnik.RadnikID
    AND Radnik.PoslovnicaID=ifnull(p_PoslovnicaID, Radnik.PoslovnicaID)
WHERE CAST(Racun.DatumVrijeme AS date) >= ifnull(p_DatumOd, Racun.DatumVrijeme)
  AND CAST(Racun.DatumVrijeme AS date) <= ifnull(p_DatumDo, Racun.DatumVrijeme);

END //
票数 0
EN

Stack Overflow用户

发布于 2020-07-25 06:27:04

代码语言:javascript
复制
COALESCE(might_be_null, fallback_value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63078381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档