Проверьте, является ли подзапрос 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 2

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 else SELECT sid.

SELECT sid FROM (
    SELECT IF(ISNULL(sid), 0, sid) FROM myTable WHERE keyword='tank') AS InnerTmp
    LIMIT 1