1

我将日期作为逗号分隔值传递,例如。param1 = 2012-01-12,2013-02-15,2012-12-01 这将被输入到我的程序中,以及如何获取作为参数传递给我的程序的所有日期的值。

我尝试过使用: select value from table1 where date_value in (param1); 但它给了我一个空集。

请告诉我如何解决它。

更新:

DELIMITER $$
CREATE FUNCTION test2(dates text)
RETURNS text  READS SQL DATA
BEGIN
DECLARE abc text;
DECLARE hi text;

SET hi= concat('''',regex_replace('[,]',''',''',dates),'''');

select value into abc from table1 where date_time in (hi);

RETURN abc;
END;
$$
DELIMITER ;

我对该函数的输入将是多个日期:例如:2010-12-12,2012-12-10,.....

我的 regex_replace 函数将以这种格式返回日期:'2010-12-12','2012-12-10' 并将其设置为变量并传递它。

但我总是得到一个空集。我哪里出错了?

4

1 回答 1

1

您在示例中尝试做的是动态构建 SQL。这需要使用准备好的语句来完成。但是,准备好的语句不能在函数中使用,如果有人可以操纵“日期”变量,它们也会带来安全风险。

相反,我建议拆分日期变量并将这些部分插入到临时表中,然后对此进行查询。我在下面做了一个简单的例子:

DROP FUNCTION IF EXISTS checkCommaList;
DELIMITER #
CREATE FUNCTION checkCommaList(dates text)
RETURNS text
BEGIN

    DECLARE abc text;

    DROP TEMPORARY TABLE IF EXISTS checkCommaListTemp;
    CREATE TEMPORARY TABLE checkCommaListTemp(textToSearch text); 

    WHILE (LOCATE(',',dates) > 0)
    DO
        SET @found = SUBSTRING(dates, 1, LOCATE(',', dates) - 1 );
        SET dates = SUBSTRING(dates, LOCATE(',', dates) + 1);
        INSERT INTO checkCommaListTemp VALUES (@found);
    END WHILE;

    SELECT `value` INTO abc FROM table1 
        WHERE date_time IN (SELECT * FROM checkCommaListTemp);

    DROP TEMPORARY TABLE checkCommaListTemp ;

    RETURN abc;

END;
#
DELIMITER ;

DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (`value` text, date_time text);
INSERT INTO table1 (`value`, date_time) VALUES ('a', '2010-12-12');

SELECT checkCommaList('2010-12-12,2012-12-10');

但是,可能有更有效的方法可以实现您想要的。

于 2013-11-04T14:24:20.390 回答