Comment vérifier les valeurs nulles / vides / d'espaces avec un seul test?

88

Je voudrais écrire une instruction SELECT qui n'utilise qu'un seul test pour renvoyer des colonnes sans valeur (null, vide ou tous les espaces).

J'ai pensé que cela fonctionnerait:

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

Mais cela ne fonctionne pas pour les valeurs NULL.

Bien sûr, je peux ajouter

OR column_name IS NULL

et cela fonctionnera, mais j'aimerais une méthode qui utilise un seul test.

John Gordon
la source
1
En relation: stackoverflow.com/questions/4042496/…
OMG Ponies
N'est-il pas souhaitable d'avoir plusieurs tests? c'est-à-dire plus de granularité = meilleur retour d'information aux utilisateurs sur la manière de corriger les données.
jour du
@onedaywhen: En général, il peut être préférable d'avoir plus de granularité, mais je travaille avec une base de code existante et je veux imiter la structure de code existante aussi étroitement que possible. Le code actuel ne fait qu'un seul test, donc je cherchais une solution qui n'avait également qu'un seul test.
John Gordon

Réponses:

99

Fonctionnellement, vous devriez pouvoir utiliser

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Le problème, c'est qu'un index sur COLUMN_NAME ne serait pas utilisé. Vous devrez avoir un index basé sur la fonction sur TRIM (nom_colonne) s'il s'agit d'une condition sélective.

Justin Cave
la source
32
Remarque pour les utilisateurs de T-SQL: il n'y a pas de TRIM, vous aurez besoin de LTRIM ou RTRIM.
demoncodemonkey
11
Depuis SQL Server 2017, il existe une fonction TRIM. Source
bvwidt
1
@ EhMann365 cette question concerne Oracle, pas Sql Server.
MH
11
RTRIM (LTRIM (nom_colonne)) - Pour les utilisateurs de Microsoft SQL.
DxTx
4
Dans Sql Server TRIM (nom_colonne) renvoie la chaîne vide «», pas NULL. D'autres réponses prennent en charge à la fois une chaîne vide et NULL
Michael Freidgeim le
25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') retournera '' si nom_colonne est NULL, sinon il retournera nom_colonne.

MISE À JOUR

Dans Oracle, vous pouvez utiliser NVLpour obtenir les mêmes résultats.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''
GendoIkari
la source
3
en fait, cela ne fonctionne toujours pas dans Oracle, Oracle traite les chaînes vides comme NULL, vous n'aurez donc peut-être pas de clause "pas comme ''" car il est comparé à une valeur nulle
Harrison
Est-ce que je ne voudrais pas "LIKE" au lieu de NOT LIKE "?
John Gordon
Oui, désolé, j'ai mal interprété la question initiale comme voulant tout ce qui a une valeur. Mais comme l'a souligné Tanging, il ne semble pas que cela fonctionnera dans Oracle.
GendoIkari
Depuis que j'utilise Oracle, il semble que je puisse utiliser WHERE TRIM (col) IS NULL et cela prendra en charge les valeurs nulles, vides et d'espaces.
John Gordon
Evidemment, la première partie manque une parenthèse, il devrait être:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan
14

La fonction NULLIF convertira toute valeur de colonne avec uniquement des espaces en une valeur NULL. Fonctionne pour T-SQL et SQL Server 2008 et plus.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
MerrickPlainview
la source
1
Une bonne réponse contiendrait une explication du code et pourquoi il a été écrit de cette façon. Je vous recommande de mettre à jour votre réponse :-)
Qirel
1
Quel est le point de cela? Il serait plus efficace de le définir simplement sur [nom_colonne] LIKE ''
SILENT
Il a besoin de TRIM pour prendre en charge plusieurs espaces blancs
Michael Freidgeim
1
Test sur SQL Server 2017, cela fonctionne pour plusieurs espaces blancs sans TRIM. Cela n'a pas de sens pour moi, car selon la documentation, NULLIF ne doit retourner NULL que si les deux expressions sont égales, et une chaîne d'espaces n'est généralement pas égale à une chaîne vide. (Je n'ai testé que les espaces, pas les tabulations, les nouvelles lignes ou d'autres caractères d'espacement.)
Jovie
1
@Jovie SQL Server ignore parfois les espaces de fin, lisez: stackoverflow.com/questions/17876478/…
Brian MacKay
7

Lors de la vérification de la null or Emptyvaleur d'une colonne, j'ai remarqué qu'il y avait des problèmes de support dans diverses bases de données.

Chaque base de données ne prend pas en charge TRIM méthode.

Vous trouverez ci-dessous la matrice juste pour comprendre les méthodes prises en charge par différentes bases de données.

La fonction TRIM dans SQL est utilisée pour supprimer le préfixe ou le suffixe spécifié d'une chaîne. Le motif le plus souvent supprimé est celui des espaces blancs. Cette fonction est appelée différemment dans différentes bases de données:

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

Comment vérifier les espaces vides / nuls / blancs: -

Voici deux manières différentes selon différentes bases de données

La syntaxe de ces fonctions de découpage est:

  1. Utilisation de Trim pour vérifier

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Utilisation de LTRIM et RTRIM pour vérifier-

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

Les deux méthodes ci-dessus fournissent le même résultat, utilisez simplement en fonction de votre support DataBase. Il renvoie simplement la table FirstNamefrom UserDetailssi elle a un videLastName

En espérant que cela aidera les autres aussi :)

Vikash Pandey
la source
WITH t as (sélectionnez '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; n'a pas retourné 3 enregistrements sur le serveur SQL
Waqar
5
Pourquoi les deux L & RTRIM seraient-ils nécessaires? Une seule des fonctions ne suffirait-elle pas pour vérifier si la colonne est vide?
SILENT
4

Cette requête phpMyAdmin renvoie ces lignes, qui ne sont PAS nulles ou vides ou juste des espaces:

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

si vous voulez sélectionner des lignes nulles / vides / juste des espaces, supprimez simplement NOT.

Choisissez
la source
2

Utilisez la requête ci-dessous et cela fonctionne

SELECT column_name FROM table_name where isnull(column_name,'') <> ''
dvenkateshreddy
la source
0

Ce que j'utilise IsNotNullOrEmptyOrWhiteSpacedans T-SQL est:

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

Toutes les suggestions de personnes pour exécuter une requête dans Oracle pour trouver des enregistrements dont le champ spécifique est juste vide (cela n'inclut pas (null) ou tout autre champ juste une ligne vide) n'a pas fonctionné. J'ai essayé chaque code suggéré. Je suppose que je vais continuer à chercher en ligne.

*****MISE À JOUR*****

J'ai essayé cela et cela a fonctionné, je ne sais pas pourquoi cela ne fonctionnerait pas si <1 mais pour une raison quelconque <2 fonctionnait et ne renvoyait que les enregistrements dont le champ est juste vide

sélectionnez [nom_colonne] dans [nom_table] où LENGTH (nom_colonne) <2;

Je suppose que le script qui a été utilisé pour convertir les données a laissé quelque chose dans le champ même s'il est vide, je suppose de toute façon pourquoi le <2 fonctionne mais pas <1

Cependant, si vous avez d'autres valeurs dans ce champ de colonne qui contiennent moins de deux caractères, vous devrez peut-être trouver une autre solution. S'il n'y a pas beaucoup d'autres personnages, vous pouvez les distinguer.

J'espère que ma solution aidera quelqu'un d'autre un jour.

ChatFemme
la source
-3

Comme dans Oracle, vous pouvez utiliser la fonction NVL dans MySQL, vous pouvez utiliser IFNULL (columnaName, newValue) pour obtenir le résultat souhaité comme dans cet exemple

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
Marina Planells
la source
-4

vous pouvez utiliser

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
gong15A
la source