Як перевірити наявність нульових / порожніх / пробілів за допомогою одного тесту?


88

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

Я думав, це буде працювати:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Але це не працює для значень NULL.

Звичайно, можу додати

OR column_name IS NULL

і це буде працювати, але я хотів би спосіб, який використовує один тест.



Чи не бажано проводити кілька тестів? тобто більше деталізації = кращий відгук користувачів про те, як виправити дані.
одного дня, коли

@onedaywhen: Загалом, можливо, було б краще мати більше деталізації, але я працюю з існуючою базою коду, і я хочу максимально точно імітувати існуючу структуру коду. Поточний код виконує лише один тест, тому я шукав рішення, яке також мало лише один тест.
Джон Гордон,

Відповіді:


99

Функціонально ви повинні вміти користуватися

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Проблема в тому, що індекс на стовпці COLUMN_NAME не використовуватиметься. Вам потрібно мати функціональний індекс TRIM (ім'я_столбця), якщо це селективна умова.


32
Примітка для користувачів T-SQL: TRIM не існує, вам знадобиться LTRIM або RTRIM.
demoncodemonkey

11
З SQL Server 2017 існує функція TRIM. Джерело
bvwidt

1
@ EhMann365 це питання стосується Oracle, а не сервера SQL.
MH

11
RTRIM (LTRIM (ім'я_стовпця)) - для користувачів SQL Microsft.
DxTx

4
У Sql Server TRIM (ім'я_столбця) повертає порожній рядок '', а не NULL. Інші відповіді підтримують як порожній рядок, так і NULL
Michael Freidgeim

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') поверне '', якщо ім'я_столбця NULL, інакше поверне ім'я_столбця.

ОНОВЛЕННЯ

В Oracle ви можете використовувати NVLдля досягнення тих самих результатів.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
насправді це все ще не працює в Oracle, Oracle трактує порожні рядки як NULL, тому у вас може не бути фрази "не подобається" ', оскільки це порівняння з нульовим значенням
Гаррісон

Чи не хотів би я ЛЮБИТИ `` замість НЕ ПОДОБАТИ ''?
Джон Гордон,

Так, вибачте, неправильно прочитав оригінальне питання, як бажаючи всього, що має цінність. Але, як зазначив tanging, схоже, це не спрацює в Oracle.
GendoIkari

Оскільки я використовую Oracle, схоже, я можу використовувати WHERE TRIM (col) IS NULL, і це піклується про значення null, blank та пробіли.
Джон Гордон,

Очевидно, що в першій частині відсутні дужки, це повинно бути:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

14

Функція NULLIF перетворить будь-яке значення стовпця з лише пробілами у значення NULL. Працює для T-SQL та SQL Server 2008 та новіших версій.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
Хороша відповідь містила б пояснення коду та чому він написаний саме так. Рекомендую оновити свою відповідь :-)
Qirel

1
Який сенс у цьому? Було б ефективніше просто встановити для нього [ім'я_столбця] ПОДОБАВНО ''
SILENT

Для підтримки декількох пробілів йому потрібен TRIM
Michael Freidgeim

1
Тестуючи на SQL Server 2017, це працює для кількох пробілів без TRIM. Для мене це не має сенсу, оскільки згідно з документацією NULLIF повинен повертати NULL, лише якщо два вирази рівні, а рядок пробілів зазвичай не дорівнює порожньому рядку. (Я тестував лише пробіли, а не вкладки, нові рядки чи інші пробіли.)
Джові

1
@Jovie SQL Server іноді ігнорує пробіли, читаючи: stackoverflow.com/questions/17876478/…
Брайан Маккей,

7

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

Кожна база даних не підтримує TRIM метод.

Нижче наведена матриця лише для розуміння методів, що підтримуються різними базами даних.

Функція TRIM в SQL використовується для видалення зазначеного префікса або суфікса з рядка. Найпоширеніший шаблон, що видаляється, - пробіли. Ця функція називається по-різному в різних базах даних:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • SQL Server: TRIM(), 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

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


З t як (виберіть '' c об'єднання все виберіть '' c об'єднання всі виберіть NULL) SELECT * FROM t ДЕ LTRIM (RTRIM (c)) НУЛЬ; не повернув 3 записи на SQL-сервері
Waqar

5
Навіщо потрібні обидва L & RTRIM? Чи не достатньо лише однієї з функцій, щоб перевірити, чи стовпець порожній?
SILENT

4

Цей запит phpMyAdmin повертає ті рядки, які НЕ є нульовими або порожніми, або просто пробіли:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

якщо ви хочете вибрати нульові / порожні / просто пробіли, просто видаліть НЕ.



0

Для чого я використовую IsNotNullOrEmptyOrWhiteSpaceв T-SQL:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

0

Кожна пропозиція щодо запуску запиту в Oracle для пошуку записів, конкретне поле яких є лише порожнім (не враховуючи (null) або будь-яке інше поле, лише порожній рядок), не спрацювала. Я спробував кожен запропонований код. Думаю, я продовжуватиму шукати в Інтернеті.

***** ОНОВЛЕННЯ *****

Я спробував це, і це спрацювало, не впевнений, чому це не спрацювало б, якщо <1, але з якихось причин <2 працювало і повертало лише записи, поле яких просто пусте

виберіть [Ім'я стовпця] з [Ім'я таблиці], де LENGTH (Ім'я стовпця) <2;

Я здогадуюсь, що будь-який скрипт, який був використаний для перетворення даних, залишив щось у полі, навіть якщо він відображається пустим, це все одно припускаю, чому <2 працює, але не <1

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

Сподіваюся, моє рішення колись допоможе комусь іншому.


-3

Як і в Oracle, ви можете використовувати функцію NVL в MySQL, ви можете використовувати IFNULL (columnaName, newValue) для досягнення бажаного результату, як у цьому прикладі

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

ви можете використовувати

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.