Подтвердить что ты не робот

Как использовать значение string/column в качестве константы интервала даты mysql (DAY, MONTH...)?

У меня есть три столбца: столбец даты, целочисленный столбец и столбец varchar следующим образом:

+------------+------+---------+
| date       |value |  unit   |
+------------+------+---------+
| 2009-01-01 |    2 | DAY     | 
| 2009-02-01 |    3 | MONTH   | 
+------------+------+---------+

Я хочу использовать значения целого числа и столбца varchar в функции mysql date_add() как часть выражения "INTVERAL", добавленного к дате в столбце "дата".

Например: date_add (2009-01-01, INTERVAL 2 ДЕНЬ), так что '2009-01-01' - это дата ' столбец, "2" находится из столбца "значение" /целочисленный, а "ДЕНЬ" - из столбца "unit" /varchar.

И выбор будет выглядеть так:

select date_add(table.date_column, INTERVAL table.integer_column table.varchar_column) from table

Проблема в том, что она не работает. Дата и целочисленный столбец работают, поэтому это нормально:

 select date_add(table.date_column, INTERVAL table.integer_column DAY) from table

но , как только я попытаюсь заменить ключевое слово "ДЕНЬ" на строковое значение из столбца, я получаю сообщение об ошибке.

Любые идеи?

Я думаю, что в общем случае проблема такова:

Как использовать динамически полученные значения в качестве констант/выражений ключа? Есть ли какая-то функция eval в mysql?

Эта проблема давно искала меня, любая помощь была бы действительно большой.

Бит

4b9b3361

Ответ 1

К сожалению, 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

Также работает в предложении WHERE:)

Ответ 2

Я думаю, вам лучше использовать оператор 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; | 
+------------+------+------------------------------------+

Ответ 3

Я нахожусь в середине переустановки MySQL на своей машине, поэтому я не могу его протестировать, но, возможно, объединение их в допустимую строку может помочь, если здесь разрешен CONCAT():

SELECT 
   DATE_ADD(
      table.date_column, 
      INTERVAL CONCAT(
         table.integer_column,
         ' ',
         table.varchar_column
      )
   )