Проверьте, является ли подзапрос NULL
У меня есть такой запрос:
SELECT sid FROM (SELECT * FROM myTable WHERE keyword='tank') AS InnerTmp LIMIT 1
Иногда внутренний запрос равен нулю. Я хочу заменить NULL на 0. Я попробовал это, но это не работает:
SELECT sid FROM (SELECT IFNULL(sid,0) AS sid FROM myTable WHERE keyword='tank') AS InnerTmp LIMIT 1
2 ответа:
Вы имеете в виду, что когда нет строк, где ключевое слово='tank', то подзапрос вернет нулевые строки?
Вот способ обойти это: используйте внешнее соединение, чтобы получить хотя бы одну строку, и сопоставьте ее с набором строк, где ключевое слово='tank'. Если таких строк нет, он все равно возвращает одну строку с другой стороны внешнего соединения. Затем вы можете использовать COALESCE (), чтобы по умолчанию sid был равен фиктивному нулевому значению.
SELECT sid FROM ( SELECT COALESCE(myTable.sid, t.placeholder) AS sid FROM (SELECT 0 AS placeholder) AS t LEFT OUTER JOIN myTable ON keyword='tank' ) AS InnerTmp LIMIT 1
Проблема в том, что вы только проверяете, если
sid
являетсяNULL
и если да, то выSELECT 0
, но если нет, то вы тоже выбираете 0. Это потому, что если условиеIFNULL
не выполняется, оно возвращает 0 (FALSE
).Вы должны использовать предложение
IF
и проверить, является лиISNULL(sid)
1 (TRUE
). Если это так, тоSELECT 0
elseSELECT sid
.SELECT sid FROM ( SELECT IF(ISNULL(sid), 0, sid) FROM myTable WHERE keyword='tank') AS InnerTmp LIMIT 1