Как проверить, является ли столбец пустым или пустым в MySQL?

288

У меня есть столбец в таблице, который может содержать нулевые или пустые значения. Как проверить, является ли столбец пустым или пустым в строках, присутствующих в таблице?

(e.g. null or '' or '  ' or '      ' and ...)
прийа
источник
1
Код MySQL: select isnull(mycolumn) from mytableвозвращает 1, если mycolumn равен нулю.
Эрик Лещинский
2
как насчет длины (trim (mycolumn))> 0?
Кирилл Жаккар
Для MSSQL> WHERE COLUMN <> '' ИЛИ ​​WHERE LEN (КОЛОННА)> 0 ИЛИ ГДЕ NULLIF (LTRIM (RTRIM (COLUMN)), '') НЕДЕЙСТВИТЕЛЕН
DxTx

Ответы:

445

Это выберет все строки, где some_colесть NULLили ''(пустая строка)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
Maček
источник
7
Если вы измените условие на WHERE some_col IS NULL OR some_col = ' '(один пробел вставлен в строку), то оно будет работать как на MySQL, так и на Oracle, см. Ответ «onedaywhen». some_col = ''не работает в Oracle, так как пустые строки означают NULL там.
Йоханна
1
@Johanna, но если вы переключитесь на ' ', то это не будет работать в SQLite. Он обрабатывает только идентичные / прямые совпадения строк.
Магне
131

Как определено стандартом SQL-92, при сравнении двух строк разной ширины более узкое значение заполняется справа пробелами, чтобы сделать его такой же ширины, как и более широкое значение. Следовательно, все строковые значения, которые состоят исключительно из пробелов (включая пробелы в нуле), будут считаться равными, например

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Следовательно, это должно работать независимо от того, сколько пробелов составляют some_colзначение:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

или более кратко:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
onedaywhen
источник
6
Спасибо за упоминание проложенных мест. Вы можете извлечь из них прибыль и изменить условие на WHERE some_col IS NULL OR some_col = ' '(один пробел вставляется в строку), тогда оно будет работать как на MySQL, так и на Oracle. some_col = ''не работает в Oracle, так как пустые строки означают NULL там, и полное условие становится NULL.
Джоанна
Моим требованием было найти SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; и SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;работать на меня в MySQL. Надеюсь, это будет полезно.
Динука Даяратна
На самом деле '' = ' 'работает в SQLServer, но не в SQLite, насколько я могу судить, из тестирования сейчас.
Магне
66

Более короткий способ написать условие:

WHERE some_col > ''

Так как null > ''производит unknown, это имеет эффект фильтрации nullи пустой строки.

Andomar
источник
2
Есть ли способ получить обратное, получить все записи с нулевым значением или пустой строкой?
Джошуа Пинтер
14
@JoshPinter:coalesce(some_col, '') = ''
Andomar
6
Возможно, это когда-то было правдой, но не работает в MySQL 14.14.
Гуннар Тор Магнуссон
прекрасно работает и фактически является единственным способом, которым я мог бы выяснить, как отфильтровать как пустые, так и пустые поля в MariaDB
Нил Дэвис,
1
Я использую some_col <> '', чтобы найти обратную сторону этого
Chargnn
18

Вы можете проверить, является ли столбец пустым или нет, используя WHERE col IS NULLили, WHERE col IS NOT NULLнапример,

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

В вашем примере у вас есть различные перестановки пустого пространства. Вы можете удалить пустое пространство, используя TRIMи вы можете использоватьCOALESCE по умолчанию значения NULL (COALESCE возвращает первое значение ненулевого из значений вы шах.

например

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Этот последний запрос будет возвращать строки, где MyCol нулевым значением или любой длиной пробела.

Если вы можете избежать этого, лучше не использовать функцию в столбце в предложении WHERE, поскольку это затрудняет использование индекса. Если вы просто хотите проверить, является ли столбец пустым или пустым, лучше сделать это:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Смотрите TRIM COALESCE и NULL для получения дополнительной информации.

Также Работа с нулевыми значениями из документов MySQL

Код Волшебника
источник
2
Вы представляете реальное решение в очень запутанном виде. Сначала вы даете неполное решение его проблемы "где mycol равен нулю". Затем вы представляете решение, используя две вложенные функции в предложении where, даже при том, что этого следует избегать. Только тогда вы получите настоящее решение. В будущем сначала представьте свое реальное решение.
)=
Во
15

Другой метод без ГДЕ, попробуйте это ..

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

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
PodTech.io
источник
это возвращает 1, если есть что-то ноль, почему это так?
noobie-php
NULLIF проверяет имя поля на пустое значение и преобразуется в NULL, если оно было пустым. ISNULL возвращает 1 (true), если NULLIF успешно изменил пустое поле на NULL или если оно уже было NULL .... попробуйте самостоятельно в пустом и пустом поле в таблице с двумя разделенными функциями выбрать isnull (X) выберите nullif (y)
PodTech.io
9

Либо

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

или

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Рейнанте Дайтол
источник
6

Я ненавижу грязные поля в моих базах данных. Если столбец может быть пустой строкой или пустым, я бы лучше исправил это перед каждым выбором select, например так:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Это обеспечивает чистоту данных, если по какой-то причине вам не нужно специально различать NULL и пусто.

Кит Джонсон
источник
5

пытаться

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

или

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Ссылка

diEcho
источник
5

Это утверждение намного понятнее и понятнее для меня:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Amaynut
источник
4

Проверяя null or Emptyзначение для столбца в моем проекте, я заметил, что есть некоторая проблема поддержки в различных базах данных.

Каждая база данных не поддерживает TRIM метод.

Ниже приведена матрица для понимания поддерживаемых методов различными базами данных.

Функция TRIM в SQL используется для удаления указанного префикса или суффикса из строки. Самый распространенный шаблон - это пробелы. Эта функция вызывается по-разному в разных базах данных:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • SQL Server: RTRIM(), LTRIM()

Как проверить пустой / ноль: -

Ниже приведены два разных способа в зависимости от различных баз данных.

Синтаксис для этих функций обрезки:

  1. Использование Trim для проверки

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Использование LTRIM & RTRIM для проверки

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Вышеупомянутые оба способа дают один и тот же результат, просто используйте его на основе вашей базы данных. Он просто возвращает FirstNameиз UserDetailsтаблицы, если он имеет пустойLastName

Надеюсь, это поможет вам :)

Викаш Пандей
источник
3

Если вы хотите, чтобы значения NULL были представлены последними при выполнении ORDER BY, попробуйте следующее:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
Ghostman
источник
3

Вы также можете сделать

SELECT * FROM table WHERE column_name LIKE ''

Обратное существо

SELECT * FROM table WHERE column_name NOT LIKE ''
brenjt
источник
Видимо не работает: select NULL like ''возвращает NULL- по крайней мере, в MySQL.
Тит
2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Балтазар Морено
источник
У меня была проблема по сравнению с полем, которое иногда было нулевым. Это помогло:col1 != IFNULL(col2,'')
вебахолик
1

Проверить на ноль

$column is null
isnull($column)

Проверить на пустое

$column != ""

Тем не менее, вы всегда должны установить NOT NULL для столбца,
оптимизация mysql может обрабатывать только один уровень IS NULL

ajreal
источник
3
Никогда не принимать NULLценности - это еще одна тема для обсуждения. Я не думаю, что было бы целесообразно давать эту рекомендацию без объяснения причин.
Мачек
Я включил, будь терпеливым. Плюс это действительно усложняет жизнь, используя NULL (как этот вопрос).
ajreal
5
Это ужасная рекомендация. Установка NOT NULL для столбца, значение которого может быть неизвестно во время INSERT, служит только для поощрения использования нестандартных «нулевых» значений, таких как -1и ''.
Дэн Бешард
@ Дан, если вы не уверены, каково значение во время вставки, у вас могут возникнуть трудности с проведением любой возможной оптимизации
ajreal
0
select * from table where length(RTRIM(LTRIM(column_name))) > 0
Хакан Ильгар
источник
1
Какой смысл в использовании как RTRIMи LTRIM, но не TRIM?
Нико Хаасе
0

В моем случае во время импорта данных в столбец было введено пространство, и хотя он выглядел как пустой столбец, его длина была равна 1. Поэтому сначала я проверил длину пустого столбца, используя length(column)затем, основываясь на этом, мы можем написать поисковый запрос.

SELECT * FROM TABLE WHERE LENGHT (COLUMN) = длина столбца для пустого столбца

Г-Н И
источник
-1

попробуйте это, если тип данных - строка, а строка - ноль

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

если тип данных int или столбец 0, попробуйте это

SELECT * FROM table WHERE column_name > = 0
Монис Куреши
источник
-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
SaAy
источник
1
Неправильный ответ. Это не выберет NULL.
Пан