MySQL если не NULL, то display 1, иначе display 0


Я работаю с небольшим усложнением отображения здесь. Я уверен, что есть возможность IF/ELSE, которую я просто пропускаю.

У меня есть 2 таблицы, которые я запрашиваю (клиенты, адреса). У первого есть основная запись, но у второго может быть или не быть записи для левого соединения.

Я хочу отобразить ноль, если в таблице адресов нет записи. И я хочу отобразить только 1, Если запись существует.

что я пытался так далеко:

SELECT c.name, COALESCE(a.addressid,0) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

Это первый пример не делает этого. Но я, возможно, использую COALESCE неправильно.

Как я могу отобразить 0, если null, и 1, если что-то существует?

5 85

5 ответов:

вместо COALESCE(a.addressid,0) AS addressexists используйте CASE:

CASE WHEN a.addressid IS NOT NULL 
       THEN 1
       ELSE 0
END AS addressexists

или проще:

(a.addressid IS NOT NULL) AS addressexists

это работает, потому что TRUE отображается как 1 в MySQL и FALSE как 0.

SELECT c.name, IF(a.addressid IS NULL,0,1) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

осторожно, если вы исходите из C / C++ и ожидаете, что это сработает:

select if(name, 1, 0) ..

даже если " имя " не равно NULL, в отличие от C, ложное условие все равно срабатывает, и приведенный выше оператор возвращает 0. Таким образом, вы должны помнить, чтобы явно проверить на NULL или пустую строку:

 select if(name is null or name = '', 0, 1)

PS пример Евгения выше правильный, но я хотел уточнить этот нюанс, так как он застал меня врасплох.

SELECT 
    c.name, 
    CASE WHEN a.addressid IS NULL THEN 0 ELSE 1 END AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

другой метод без WHERE, попробуйте это..

будут выбраны как пустые, так и нулевые значения

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

он установит null, если это пустая строка, а затем будет true и на этом.