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 () - нет.


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,'')) <> '';

Вам не нужно использовать функцию обрезки, так как в 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», что, очевидно, лучше.


Я не буду отмечать вас, но: 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

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

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 '%*%'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.