我有三列:日期列,整数列和varchar列,如下所示:
+------------+------+---------+
| date |value | unit |
+------------+------+---------+
| 2009-01-01 | 2 | DAY |
| 2009-02-01 | 3 | MONTH |
+------------+------+---------+
Run Code Online (Sandbox Code Playgroud)
我想使用的整数和在MySQL DATE_ADD()函数varchar列的"INTVERAL"表达式的一部分的值,添加到日期在"日期"列.
例如:date_add(2009-01-01,INTERVAL 2 DAY),以便'2009-01-01'来自'date'列,'2'来自"value"/ integer列和" DAY"来自'unit'/ varchar列.
选择将如下所示:
select date_add(table.date_column, INTERVAL table.integer_column table.varchar_column) from table
Run Code Online (Sandbox Code Playgroud)
问题是:它不起作用.日期和整数列工作,所以这是好的:
select date_add(table.date_column, INTERVAL table.integer_column DAY) from table
Run Code Online (Sandbox Code Playgroud)
但是一旦我尝试用列中的字符串值替换"DAY"关键字,我就会收到错误消息.
有任何想法吗?
我想更普遍的问题是:
如何将动态检索的值用作常量/键表达式?mysql中有一种"eval"函数吗?
这个问题一直困扰着我很长一段时间,任何帮助都会非常棒.
击败
小智 14
不幸的是,MySQL期望INTERVAL之后的关键字而不是任何字符串或数值.您可以使用CASE语句实现所需,并为不同的案例提供不同的关键字.
例如,假设您要将具有适当单位的值添加到日期,那么SQL语句将如下所示:
SELECT CASE unit
WHEN "DAY" THEN date_add(date, INTERVAL value DAY)
WHEN "MONTH" THEN date_add(date, INTERVAL value MONTH)
END
AS newDate
FROM table
Run Code Online (Sandbox Code Playgroud)
顺便也适用于WHERE子句:)
我认为你最好为单位列的每个可能值使用CASE语句,因为它是一个有限的宇宙.您可以选择是将列保留为varchar,还是使用整数代码.
即使从现有表生成,我也不鼓励使用动态执行的SQL语句,除非您在限制插入表中的值时要小心120%.如果你以某种方式在表格中得到以下值,你会怎么做?哎呀!
+------------+------+------------------------------------+ | date |value | unit | +------------+------+------------------------------------+ | 2009-01-01 | 2 | DAY | | 2009-02-01 | 3 | MONTH | | 2009-03-01 | 4 | DAY) FROM table; DROP TABLE table; | +------------+------+------------------------------------+