Quelle est la meilleure façon de vérifier si la valeur est une chaîne nulle ou vide dans les instructions SQL Postgres?
La valeur peut être une expression longue, il est donc préférable qu'elle ne soit écrite qu'une seule fois.
J'utilise actuellement:
coalesce( trim(stringexpression),'')=''
Mais ça a l'air un peu moche.
stringexpression
peut être une char(n)
colonne ou une expression contenant des char(n)
colonnes avec des espaces de fin.
Quelle est la meilleure façon?
char
est presque toujours le mauvais choix en raison du rembourrage (et du gaspillage d'espace qui en résulte). Mais à part ça: je ne pense pas qu'il y ait de meilleure solution.Réponses:
L'expression
stringexpression = ''
donne:TRUE
.. pour''
(ou pour toute chaîne composée uniquement d'espaces avec le type de donnéeschar(n)
)NULL
.. pourNULL
FALSE
.. pour tout le resteDonc, pour vérifier: "
stringexpression
est NULL ou vide" :Ou l'approche inverse (peut être plus facile à lire):
Fonctionne pour tout type de caractère, y compris
char(n)
. Le manuel sur les opérateurs de comparaison.Ou utilisez votre expression d'origine sans
trim()
, ce qui est un bruit coûteux pourchar(n)
(voir ci-dessous), ou incorrecte pour d'autres types de caractères: les chaînes constituées uniquement d'espaces passeraient comme une chaîne vide.Mais les expressions au sommet sont plus rapides.
Affirmer le contraire est encore plus simple: "
stringexpression
n'est ni NULL ni vide" :À propos
char(n)
Ceci est sur le type de données
char(n)
, abréviation de:character(n)
. (char
/character
sont des abréviations dechar(1)
/character(1)
.) Son utilisation est déconseillée dans Postgres :Ne pas confondre
char(n)
avec d' autres, les types de caractères utilesvarchar(n)
,varchar
,text
ou"char"
(avec guillemets).Dans
char(n)
une chaîne vide n'est pas différente de toute autre chaîne composée uniquement d'espaces. Tous ces éléments sont pliés en n espaceschar(n)
par définition du type. Il s'ensuit logiquement que les expressions ci-dessus fonctionnent pourchar(n)
aussi bien - tout autant que celles-ci (qui ne fonctionneraient pas pour d'autres types de caractères):Démo
Une chaîne vide équivaut à toute chaîne d'espaces lorsqu'elle est convertie en
char(n)
:Résultat:
Teste la "chaîne nulle ou vide" avec
char(n)
:Résultat:
Teste la "chaîne nulle ou vide" avec
text
:Résultat:
db <> violon ici
Ancien sqlfiddle
En relation:
la source
best way to check if value is null or empty string
. L'trim()
appel est (comparativement) cher - et tout simplement pas nécessaire. J'ai ajouté plus surchar(n)
et "chaîne vide".''
. Puis-je retirer la garniture et l'utilisercoalesce(stringexpression,'')=''
pour vérifier. Cela me semble plus lisible que votre réponse.select coalesce(' ', '') = ''
renvoie false. Donc TRIM () est requiscoalesce(' '::char(5), '') = ''
non. J'utiliserais dans tous les cas l'une des deux principales expressions, qui fonctionnent pour n'importe quel type de caractère et sont les plus rapides et les plus propres.Pour vérifier les valeurs nulles et vides:
Pour vérifier les valeurs nulles, vides et espaces (coupez la chaîne)
la source
La vérification de la longueur de la chaîne fonctionne également et est compacte:
la source
where length(stringexpression) = 0;
. Cela fonctionne pour moi.S'il peut y avoir des espaces de fin vides, il n'y a probablement pas de meilleure solution.
COALESCE
est juste pour des problèmes comme le vôtre.la source
Quelque chose que j'ai vu des gens utiliser est
stringexpression > ''
. Ce n'est peut-être pas le plus rapide, mais il se trouve être l'un des plus courts.Je l'ai essayé sur MS SQL ainsi que sur PostgreSQL.
la source
une autre façon est
la source
Ma façon préférée de comparer les champs nullables est: NULLIF (nullablefield,: ParameterValue) IS NULL AND NULLIF (: ParameterValue, nullablefield) IS NULL. Ceci est encombrant mais est d'une utilisation universelle alors que Coalesce est impossible dans certains cas.
La seconde utilisation inverse de NULLIF est due au fait que "NULLIF (nullablefield,: ParameterValue) IS NULL" retournera toujours "true" si le premier paramètre est nul.
la source
Si la base de données ayant un grand nombre d'enregistrements
null check
peut prendre plus de temps, vous pouvez utiliser la vérification nulle de différentes manières, comme: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
la source
Beaucoup de réponses sont le moyen le plus court, pas nécessairement le meilleur si la colonne contient beaucoup de valeurs nulles. L'interruption des vérifications permet à l'optimiseur d'évaluer la vérification plus rapidement car il n'a pas à travailler sur l'autre condition.
La comparaison de chaînes n'a pas besoin d'être évaluée car la première condition est fausse.
la source