У меня есть база данных, в которой хранятся материалы в соответствующих форматах: «Идиот» (роман), «Гамлет» (игра), «Звездные войны» (сценарий) и т. Д.
Я использую функцию 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'";
Заранее спасибо.
Аргумент нуждался в правильном синтаксисе. Три решения: —
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.
Других решений пока нет …