MySQL выберите, где столбец не пуст

182

В MySQL я могу выбрать столбцы только там, где что-то существует?

Например, у меня есть следующий запрос:

select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2

Я пытаюсь выбрать только те строки, где телефон начинается с 813, а в phone2 что-то есть.

Майк
источник
2
Можете ли вы уточнить, что вы подразумеваете под « phone2есть что-то в этом»? Люди догадываются, имеете ли вы в виду, что phone2НЕ НУЖНО, не пусто, не исключительно пробелы и т. Д.
pilcrow
1
если «что-то» существует, оно, очевидно, не равно нулю.
Майк

Ответы:

277

Сравните значение phone2с пустой строкой:

select phone, phone2 
from jewishyellow.users 
where phone like '813%' and phone2<>''

Обратите внимание, что NULLзначение интерпретируется как false.

Иван Невоструев
источник
5
Одинарные кавычки, а не двойные.
OMG Ponies
2
phone2<>""не пройдет мимо любой проверки синтаксиса SQL.
OMG Ponies
5
@OMG Пони: Но это работает в MySQL. Это единственный проверяющий, что важно
Иван Невоструев
7
@ivan: Новости для меня, извините за это.
OMG Ponies
<> такой же, как! =. это было просто но я не знал :)
MFarooqi
48

Чтобы проверить, является ли поле пустым, используйте IS NULL,IS NOT NULL операторы.

MySql ссылка http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

Станислав Стоянов
источник
10
OP запрашивает только те строки, которые имеют что-то в поле phone2. IS NOT NULL возвращает все, что буквально не установлено в NULL, даже пустую строку "". ! = '' или <> '', как сказал Иван в принятом ответе, не будет возвращать пустые строки или значения NULL. Другими словами, IS NOT NULL является подмножеством! = '', Но они не эквивалентны.
Нет
34

Проверьте NULLи пустые строковые значения:

select phone
, phone2 
from users 
where phone like '813%' 
and trim(coalesce(phone2, '')) <>''

Примечание: COALESCE () - это стандарт SQL (-ish), а ISNULL () - нет.

davek
источник
1
Вам не нужно использовать функцию обрезки, поскольку в MySQL строка с любым количеством пробелов равна другой строке с любым количеством пробелов, я написал об этом довольно подробно stackoverflow.com/a/ 42723975/728236
Брайан Лейшман
26

Ответ, который я использовал, который работал для меня довольно хорошо, который я не видел здесь (этот вопрос очень старый, поэтому он, возможно, не работал тогда), на самом деле

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 > ''

Обратите внимание на > ''часть, которая проверит, является ли значение не нулевым, и является ли значение не просто пробелом или пробелом.

По сути, если в поле есть что-то кроме пробела или NULL, это правда. Это также очень короткий, так что это легко написать, и еще один плюс над COALESCE()иIFNULL() функциями, что это индекс дружественного, так как вы не сравниваете выход функции на поле ни к чему.

Тестовые случаи:

SELECT if(NULL > '','true','false');-- false
SELECT if('' > '','true','false');-- false
SELECT if(' ' > '','true','false');-- false
SELECT if('\n' > '','true','false');-- false
SELECT if('\t' > '','true','false');-- false
SELECT if('Yeet' > '','true','false');-- true

ОБНОВЛЕНИЕ Есть предостережение, которого я не ожидал, но числовые значения, которые равны нулю или ниже, не больше, чем пустая строка, поэтому, если вы имеете дело с числами, которые могут быть нулевыми или отрицательными, НЕ ДЕЛАЙТЕ ЭТОГО , это укусило меня совсем недавно и было очень трудно отлаживать :(

Если вы используете строки (char, varchar, text и т. Д.), То это будет прекрасно, просто будьте осторожны с числами.

Брайан Лэйшман
источник
17

Если в поле phone2 есть пробелы от случайного ввода данных, вы можете игнорировать эти записи с помощью функций IFNULL и TRIM:

SELECT phone, phone2
FROM jewishyellow.users
WHERE phone LIKE '813%'
    AND TRIM(IFNULL(phone2,'')) <> '';
micahwittman
источник
Вам не нужно использовать функцию обрезки, так как в MySQL строка с любым количеством пробелов равна другой строке с любым количеством пробелов, я написал об этом довольно подробно stackoverflow.com/a/ 42723975/728236
Брайан Лейшман
7
select phone, phone2 from jewishyellow.users 
where phone like '813%' and phone2 is not null
Клаус Бысков Педерсен
источник
6
Обратите внимание, что есть разница между NULLзначением и пустой строкой, ''которая является значением. Если вы хотите проверить пустую строку, используйте, column <> ''как предложено в других ответах.
Джунейт
7
SELECT phone, phone2 
FROM jewishyellow.users 
WHERE phone like '813%' and (phone2 <> "");

Может потребоваться некоторая настройка в зависимости от значения по умолчанию. Если вы допустили заполнение Null, вы можете вместо этого сделать «Not NULL», что, очевидно, лучше.

Satanicpuppy
источник
Я не буду отмечать вас, но: 1) NOT()в MySQL нет функции 2) phone2=""не пройдёт проверку SQL-синтаксиса.
OMG Ponies
1
Хех, прости. Я использую много разных серверов SQL.
Satanicpuppy
2

Мы можем использовать CASE для установки пустого значения в некоторый символ или строку. Я использую NA в качестве строки по умолчанию.

SELECT phone,   
CASE WHEN phone2 = '' THEN 'NA' END AS phone2 ELSE ISNULL(phone2,0) 
FROM jewishyellow.users  WHERE phone LIKE '813%'
Атула
источник
2

Другая альтернатива - посмотреть на CHAR_LENGTHзначения столбца. (не путать сLENGTH )

Использование критерия, где длина символа больше 0, позволит избежать ложных срабатываний, когда значения столбца могут быть ложными, например, в случае целочисленного столбца со значением 0илиNULL . Поведение более согласованно между различными типами данных.

В результате получается любое значение длиной не менее 1 символа или не пустое.

Пример https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1

SELECT phone, phone2
FROM users
WHERE phone LIKE '813%'
AND CHAR_LENGTH(phone2) > 0

Данные таблицы

users
phone (varchar 12) | phone2 (int 10)
"813-123-4567"     | NULL
"813-123-4567"     | 1
"813-123-4567"     | 0

users2
phone (varchar 12) | phone2 (varchar 12)
"813-123-4567"     | NULL
"813-123-4567"     | "1"
"813-123-4567"     | "0"
"813-123-4567"     | ""

CHAR_LENGTH(phone2) > 0Результаты (такие же)

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

альтернативы

phone2 <> ''Результаты (разные)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 > ''Результаты (разные)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0

COALESCE(phone2, '') <> ''Результаты (такие же)
Примечание: результаты отличаются от phone2 IS NOT NULL AND phone2 <> ''ожидаемых

users
813-123-4567       | 1
813-123-4567       | 0

users2
813-123-4567       | 1
813-123-4567       | 0

phone2 IS NOT NULL AND phone2 <> ''Результаты (разные)

users
813-123-4567       | 1

users2
813-123-4567       | 1
813-123-4567       | 0
fyrye
источник
2

Удивительно (как никто другой не упомянул об этом раньше) обнаружил, что условие ниже выполняет свою работу:

WHERE ORD(field_to_check) > 0 

когда нам нужно исключить как нулевые, так и пустые значения. Кто-нибудь знает о недостатках этого подхода?

Сергей Ч
источник
Я часами пытался получить правильный синтаксис, и это просто решило все, спасибо!
demo7up
1

Использование:

SELECT t.phone, 
       t.phone2 
  FROM jewishyellow.users t
 WHERE t.phone LIKE '813%' 
   AND t.phone2 IS NOT NULL
OMG пони
источник
1
Я заметил, что иногда IS NOT NULLне применяется только к строковым столбцам с пустыми значениями ( ''). Я не знаю почему, но просто хотел указать на это. Это разумнее использовать t.phone2 <> ''при проверке пустых строковых столбцов.
Джунейт
0

Вы можете использовать как оператор подстановочный знак для достижения этого:

SELECT t.phone, 
       t.phone2 
FROM jewishyellow.users t
WHERE t.phone LIKE '813%' 
  AND t.phone2 like '[0-9]';

таким образом, вы можете получить все phone2, которые имеют префикс номера.

панда
источник
0

В моем случае у меня была колонка varchar, оба метода IS NOT NULL& != '' не работали , но следующее сработало для меня. Просто выкладываю это здесь.

SELECT * FROM `db_name` WHERE `column_name` LIKE '%*%'
Мохд Абдул Муджиб
источник