web-dev-qa-db-fra.com

comme '%' n'accepte pas la valeur NULL

J'ai une requête qui est construite à partir des entrées de l'utilisateur (transmise via un formulaire html). Cela ressemble à (exemple simple):

Select * From [table] Where [table].[column] like '<parameter>'

Ce paramètre peut être facultatif. Par conséquent, si l'utilisateur laisse vide le champ de saisie correspondant, je passe% . Cela a bien fonctionné jusqu'à ce que je rencontre des valeurs NULL. Je comprends que "%" correspond aux symboles non NULL, mais je voudrais considérer NULL comme une chaîne vide dans ce cas.

Que devrais-je faire? Modifier la requête (comment?) Ou transmettre un autre symbole lorsque l'utilisateur a laissé une entrée vide?

Merci.

PS. C'est le vrai problème du système existant et je sais que c'est loin d'être la solution optimale, mais je dois y faire face.

24
zgorawski

Vous pouvez utiliser coalesce pour traiter null comme une chaîne vide:

where COALESCE([table].[column],'') like '<parameter>'

Sur SQL Server, vous pouvez également utiliser IsNull:

where IsNull([table].[column],'') like '<parameter>'
52
Andomar

isnull ([table]. [colonne], '') comme '%'

Fonctionne comme un charme

3
Pedro Rodrigues

Je pense que cela pourrait fonctionner:

Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
3
bernhardrusch

Eh bien, que diriez-vous

SELECT 
  * 
FROM 
  [table] 
WHERE
  ([table].[column] like <parameter>) OR 
  (<parameter> = '%')

... de sorte que lorsque vous passez '%', vous récupériez toutes les lignes, sinon tout se passe comme si vous l'aviez.

3
Matt Gibson

Faites deux déclarations! Si l'utilisateur n'a transmis aucun paramètre utilisateur:

Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
1
Tim

Basé sur Index dans Clause Where Problème avec cette approche 

where COALESCE([table].[column],'') like '<parameter>'

Est :

Si vous avez utilisé un index sur votre [colonne], SQL Server ne peut pas utiliser votre index en raison de la fonction COALESCE, cela signifie que vous avez perdu votre index. 

ET 

Problème avec cette approche

Where [table].[column] like '%' or [table].[column] is null

Est :

Si la [table]. [Colonne] est nulle, le code sera comme ceci: 

Where null like '%' or [table].[column] is null

et quelle que soit la seconde partie de la clause Where ([table]. [colonne] est nulle) le résultat de l'évaluation sera UNKNOWN et le filtre SQL Server filtrera cet enregistrement.

NULL OR True = UNKNOWN

NULL OR False = UNKNOWN

Voici donc l'approche optimisée et nullement incluse:

Select * From [table] 
 WHERE 
      CASE 
          WHEN [table].[column] IS NULL THEN 1 
          WHEN [table].[column] like '<parameter>' THEN 1 
          ELSE 0 
      END   =  1
0
HaMEd

Je voulais quelque chose de similaire, pour pouvoir réellement trouver '%' (tout) incluant null ou une valeur spécifique lors de la saisie.

Pour Oracle isnull ne fonctionne pas et dans mon cas COALESCE non plus.

J'ai utilisé cette option dans la clause where:

where decode(table1.field1,null,' ',table1.field1) like '%'

J'espère que ça marche pour les autres.

0
nathie

Bonjour, utilisez cette solution, je pense que c'est un mélange de solutions:

@parameter nvarchar (30)

if @parameter = ''
      Begin
          Set @parameter = '%'
      End

select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'

Si vous voulez juste commencer avec le paramètre, supprime le premier '%' et le signe plus

J'espère que tu trouves cela utile

0
Neftali Rios

que diriez-vous..

Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'

Donc, cela prendra votre valeur de colonne réelle, ou si c'est nul, une chaîne vide et comparez-la contre votre paramètre, en supposant que vous utilisez ms server.

0
Shawson