Question comme '%' n'accepte pas la valeur NULL


J'ai une requête qui est créée à partir des entrées de l'utilisateur (transmises via le formulaire HTML). Il ressemble à (exemple simple):

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

Ce paramètre peut être facultatif, donc si l'utilisateur a laissé le champ de saisie correspondant vide, je réussis %. Cela a bien fonctionné jusqu'à ce que je rencontre des valeurs NULL. Je comprends que les symboles de correspondance «%» ne sont pas nuls, mais je voudrais considérer NULL comme une chaîne vide dans ce cas.

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

Merci.

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


23
2017-10-13 13:51


origine


Réponses:


Vous pouvez utiliser coalesce 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>'

51
2017-10-13 13:53



Je pense que cela pourrait fonctionner:

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

3
2017-10-13 13:53



Eh bien, que diriez-vous

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

... de sorte que lorsque vous passez '%', vous récupérez toutes les lignes, sinon cela fonctionne comme vous l'avez pour le moment.


3
2017-10-13 13:54



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

Fonctionne comme un charme


3
2017-07-27 10:03



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

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

1
2017-10-13 13:56



que diriez-vous..

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

Donc, cela prendra votre valeur de colonne réelle, ou si cela annule une chaîne vide et la compare à votre paramètre, en supposant que vous utilisez un serveur ms sql.


0
2017-10-13 13:57



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

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

Est :

Si vous avez utilisé un index sur votre [colonne], à cause de la fonction COALESCE, SQL Server ne peut pas utiliser votre index, 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 indépendamment de la deuxième partie de la clause Where ([table]. [colonne] est nulle) le résultat de l'évaluation sera INCONNU et le filtre SQL Server qui enregistre.

NULL OU True = UNKNOWN

NULL OU False = UNKNOWN

Donc, c'est l'approche optimisée et null inclus:

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

0
2017-10-06 12:18



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 par le paramètre, supprime le premier «%» et le signe plus

J'espère que tu trouves cela utile


0
2017-12-16 18:14



Je voulais quelque chose de similaire, être réellement capable de trouver «%» (tous) y compris nul ou une valeur spécifique lors de la saisie.

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

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

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

J'espère que cela fonctionne pour les autres.


0
2017-07-15 19:38