Как проверить нулевые / пустые / пробельные значения с помощью одного теста?


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 07

11
Начиная с SQL Server 2017 есть функция TRIM. Источник
bvwidt

1
@ EhMann365 этот вопрос касается Oracle, а не Sql Server.
MH

11
RTRIM (LTRIM (имя_столбца)) - для пользователей Microsft SQL.
DxTx

4
В Sql Server TRIM (имя_столбца) возвращает пустую строку '', а не NULL. Другие ответы поддерживают как пустую строку, так и NULL
Майкл Фрейдгейм,

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, поэтому у вас может не быть предложения «не похоже», поскольку оно сравнивается с нулевым значением
Харрисон

Разве я не хотел бы "НРАВИТСЯ" вместо "НЕ НРАВИТСЯ"?
Джон Гордон

Да, извините, я неправильно истолковал исходный вопрос как желающий все, что имеет ценность. Но, как указывалось, не похоже, что это будет работать в Oracle.
GendoIkari 05

Поскольку я использую Oracle, похоже, я могу использовать WHERE TRIM (col) IS NULL, и это позаботится о значениях NULL, пустых и пробельных значениях.
Джон Гордон

Очевидно, что в первой части отсутствуют круглые скобки, это должно быть:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Серж Саган

14

Функция NULLIF преобразует любое значение столбца, содержащее только пробелы, в значение NULL. Работает для T-SQL и SQL Server 2008 и выше.

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

1
Хороший ответ будет содержать объяснение кода и того, почему он был написан таким образом. Я рекомендую вам обновить свой ответ :-)
Qirel

1
Какой в ​​этом смысл? Было бы более эффективно просто установить его на [column_name] LIKE »
SILENT

Требуется TRIM для поддержки нескольких пробелов
Майкл Фрейджейм,

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()
  • Оракул: RTRIM(), LTRIM()
  • SQL Server: TRIM(), RTRIM(), LTRIM()

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

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

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

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

    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

Надеюсь, это поможет и другим :)


WITH t as (select '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; не вернул 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 работает и возвращает только записи, поле которых просто пустое

выберите [columnName] из [tableName], где LENGTH (columnName) <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.