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.
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>'
isnull ([table]. [colonne], '') comme '%'
Fonctionne comme un charme
Je pense que cela pourrait fonctionner:
Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
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.
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;
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
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.
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
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.