Як я можу перевірити, чи стовпець порожній чи недійсний у MySQL?


288

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

(e.g. null or '' or '  ' or '      ' and ...)

1
Код MySQL: select isnull(mycolumn) from mytableповертає 1, якщо мій стовпець є нульовим.
Ерік Лещинський

2
як щодо довжини (обрізка (мій стовпчик))> 0?
Кирило Жакрт

Для MSSQL> WHERE COLUMN <> '' OR WHERE LEN (COLUMN)> 0 IL WHERE NULLIF (LTRIM (RTRIM (COLUMN)), '') '' NOT NULL
DxTx

Відповіді:


445

Це дозволить вибрати всі рядки, де some_colє NULLабо ''(порожній рядок)

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

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;

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. Сподіваюся, це стане в нагоді.
Dinuka Dayarathna

Насправді '' = ' 'працює в SQLServer, але не в SQLite, наскільки я можу сказати, від його тестування зараз.
Магне

66

Коротший спосіб написання умови:

WHERE some_col > ''

Оскільки null > ''виробляє unknown, це призводить до фільтрації обох nullта порожніх рядків.


2
Чи є спосіб отримати зворотну сторону цього, отримати всі записи, де це NULL або порожній рядок?
Джошуа Пінтер

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar

6
Це можливо було і колись, але це не працює в MySQL 14.14.
Gunnar Þór Magnússon

прекрасно працює, і насправді єдиний спосіб я міг зрозуміти, як відфільтрувати нулі та порожні поля у MariaDB
Ніл Девіс,

1
Я використовую some_col <> '', щоб знайти зворотну
сторону

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 та IS NULL для отримання додаткової інформації.

Також робота з нульовими значеннями з документів MySQL


2
Ви представляєте реальне рішення дуже перекрученим способом. Спочатку ви представляєте незавершене рішення його проблеми "де міколь недійсний". Тоді ви представляєте рішення, використовуючи дві вкладені функції в пункті, де, навіть кажучи, цього слід уникати. Тільки тоді ви переходите до реального рішення. Надалі спочатку представляйте своє справжнє рішення.

Пропустіть )перед =знаком у вашому другому прикладі
Rorrim

15

Ще один метод без ДЕ, спробуйте це ..

Вибере значення «Порожнє» та «NULL»

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

це повертає 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

Я ненавиджу безладні поля у своїх базах даних. Якщо стовпець може бути порожнім рядком або нулем, я б краще виправити це перед тим, як робити вибір кожного разу, як це:

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

Це зберігає дані в порядку, якщо з певних причин вам не потрібно розмежовувати NULL та порожні.



5

Це твердження для мене набагато чіткіше і легше для читання:

select * from my_table where ISNULL(NULLIF(some_col, ''));

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

Вище вказані обидва способи забезпечують однаковий результат, просто використовуйте на основі підтримки вашої DataBase. Він просто повертає FirstNameз UserDetailsтаблиці, якщо у нього порожнійLastName

Сподіваючись, що це допоможе вам :)


3

Якщо ви хочете, щоб значення NULL були представлені останніми під час виконання ЗАМОВЛЕННЯ, спробуйте:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

Ви також можете зробити

SELECT * FROM table WHERE column_name LIKE ''

Зворотна істота

SELECT * FROM table WHERE column_name NOT LIKE ''

Мабуть, не працює: select NULL like ''повертає NULL- принаймні в MySQL.
Тіт

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

У мене виникла проблема порівняння із полем, яке іноді було недійсним. Це допомогло:col1 != IFNULL(col2,'')
webaholik

1

Перевірте на нуль

$column is null
isnull($column)

Перевірте, чи немає порожнього

$column != ""

Однак завжди слід встановлювати NOT NULL для стовпця,
оптимізація mysql може обробляти лише один рівень IS NULL


3
Ніколи не приймаючи NULLцінності - це ще одна ціла тема для обговорення. Я не вважаю за доцільне робити цю рекомендацію, не надаючи ваших міркувань.
maček

Я включив, будьте терплячі. Плюс дійсно ускладнює життя за допомогою NULL (як і це питання).
ajreal

5
Це жахлива рекомендація. Установка NOT NULL на колонці, значення якого не може бути відома в момент INSERT служить тільки для заохочення використання нестандартних значень «нульових» , як -1і ''.
Дан Бешард

@Dan, якщо ви не впевнені, яке значення має під час вставки, у вас можуть виникнути труднощі провести оптимізацію будь-якої можливості
ajreal


0

У моєму випадку під час імпорту даних в колонці було введено простір, і хоч це виглядало як порожній стовпець, його довжина становила 1. Отже, перш за все я перевірив довжину порожнього стовпця, що шукає, використовуючи length(column)потім, виходячи з цього, ми можемо написати пошуковий запит

ВИБІР * З ТАБЛИЦІ, КОЛИ ДЛЯ ДЛЯ ДЛЯ (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, '')

1
Неправильну відповідь. Це не вибереться NULL.
Панг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.