【发布时间】:2018-07-17 12:08:10
【问题描述】:
我想创建一个带有多个输入可选参数的存储过程。如果给出了至少一个字段的参数,我仍然想要一些符合条件的结果。
这是我的表定义:
CREATE TABLE `tblinquiries` (
`UID` varchar(50) DEFAULT NULL,
`ReviewDate` date NOT NULL,
`InquiryId` varchar(50) NOT NULL,
`AuditStatus` varchar(50) DEFAULT NULL,
`AssignedTo` varchar(50) DEFAULT NULL,
`Result` int(2) DEFAULT NULL,
`ResultCategories` int(2) DEFAULT NULL,
`AuditBy` varchar(50) DEFAULT NULL,
`Remarks` varchar(200) DEFAULT NULL,
`StartTime` datetime DEFAULT NULL,
`EndTime` datetime DEFAULT NULL,
PRIMARY KEY (InquiryId)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这是一个示例数据集:
INSERT INTO `tblinquiries` (`UID`, `ReviewDate`, `InquiryId`, `AuditStatus`, `AssignedTo`, `Result`, `ResultCategories`, `AuditBy`, `Remarks`, `StartTime`, `EndTime`) VALUES
('user1', '2018-07-07', '109933881', 'Assigned', 'auditor1', NULL, NULL, NULL, NULL, '2018-07-15 08:03:47', NULL),
('user2', '2018-07-07', '109933885', 'Assigned', 'auditor2', NULL, NULL, NULL, NULL, '2018-07-15 08:04:13', NULL),
('user3', '2018-07-07', '109933909', 'Complete', 'auditor3', 1, auditor3, NULL, NULL, '2018-07-15 08:06:42', '2018-07-15 08:10:42'),
('user4', '2018-07-08', '109933916', 'Check', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('user5', '2018-07-08', '109933917', 'Check', NULL, NULL, NULL, NULL, NULL, NULL, NULL),
('user6', '2018-07-08', '8790804', 'Complete', 'auditor1', 1, NULL, 'auditor1', NULL, '2018-07-14 21:19:25', '2018-07-14 21:21:29');
这是我的存储过程:
DROP procedure IF EXISTS `spInquiries`;
DELIMITER $$
CREATE PROCEDURE `spInquiries` (IN `pReviewStartDate` DATE, IN `pReviewEndDate` DATE, IN `pAuditStartDate` DATE, IN `pAuditEndDate` DATE)
BEGIN
SELECT * FROM tblinquiries
WHERE
(ReviewDate BETWEEN pReviewStartDate AND pReviewEndDate)
AND (DATE(EndTime) BETWEEN pAuditStartDate AND pAuditEndDate);
END$$
DELIMITER ;
经过大量研究,我发现this stackoverflow question 有一些相似之处。但我不知道如何使 WHERE 子句的 2 个参数(例如 - pAuditStartDate、pAuditEndDate)为空。
我添加了一个 SQL fiddle here。
我想要两个命令的一些结果:
CALL spInquiries('', '', '2018-07-01', '2018-07-31');
CALL spInquiries('2018-07-01', '2018-07-31', '', '');
我怎样才能做到这一点?
【问题讨论】: