ОБНОВЛЕНИЕ SQL с использованием CASE WHEN с переменной PHP в качестве аргумента

У меня есть база данных, в которой хранятся материалы в соответствующих форматах: «Идиот» (роман), «Гамлет» (игра), «Звездные войны» (сценарий) и т. Д.

Я использую функцию PHP, которая удаляет статьи (то есть / A / An / ‘и т. Д.) И создает переменную ($ mat_alph, которой присваивается NULL, если она не существует), с помощью которой она может быть позже алфавитизирована. Это требуется только для заголовков со статьями, но для тех, у кого их нет, я хочу сохранить это в базе данных как значение NULL.

Сохранение переменной в состоянии NULL сохраняет ее в виде пустой строки, а не фактического значения NULL, что вызывает проблемы позже при фильтрации результатов по IS NULL / IS NOT NULL (что мне нужно будет сделать при использовании команд SELECT с CASE WHEN для вызовите mat_nm для тех, у кого нет статьи, и mat_alph для тех, у кого есть). Я не хочу сохранять значение mat_alph для заголовков без статьи, так как это будет относиться к огромному количеству, повторяя значение mat_nm и тратя впустую память.

Можно ли использовать CASE WHEN в операторе UPDATE, используя переменную PHP в качестве аргумента?

Следующая попытка обрабатывает заголовки без статей достаточно хорошо (т. Е. Гамлет обновляет mat_alph до NULL), но со статьями (т. Е. Идиот) создает эту ошибку:

Сокращенное неверное значение DOUBLE: ‘Idiot’

$sql=   "UPDATE mat SET
mat_nm='$mat_nm',
mat_alph=CASE WHEN ('$mat_alph') THEN '$mat_alph' END,
mat_url='$mat_url',
frmtid=(SELECT frmt_id FROM frmt WHERE frmt_url='$frmt_url')
WHERE mat_id='$mat_id'";

Это возможно или мне нужна отдельная команда SQL UPDATE исключительно для обновления поля mat_alph?

Проблема также относится к начальным командам INSERT, и я ожидаю, что решение будет применяться к обоим.

$sql =  "INSERT INTO mat(mat_nm, mat_alph, mat_url, frmtid)
SELECT '$mat_nm', '$mat_alph', '$mat_url', frmt_id FROM frmt WHERE frmt_url='$frmt_url'";

Заранее спасибо.

2

Решение

Аргумент нуждался в правильном синтаксисе. Три решения: —

mat_alph=CASE WHEN NULLIF('$mat_alph','') IS NOT NULL THEN '$mat_alph' END

mat_alph=CASE WHEN '$mat_alph'='' THEN NULL ELSE '$mat_alph' END

mat_alph=CASE WHEN '$mat_alph'!='' THEN '$mat_alph' END

Последняя является более короткой версией второй, которая работает, потому что NULL задается по умолчанию для несоответствующих случаев.

Кредит для R937.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]