Déclaration SQL match Tout
Question
J'utilise une expression régulière dans mes instructions SQL pour une application qui ressemblent à ceci
SELECT * FROM table WHERE id = {{REPLACEME}}
Cependant, parfois je ne donne pas un paramètre pour remplacer cette chaîne avec. Est-il possible de le remplacer par quelque chose qui correspond à rien. J'ai essayé *, mais cela ne fonctionne pas.
La solution
Remplacer {{}} REPLACEME avec
[someValidValueForYouIdType] OR 1=1
Autres conseils
-
SELECT * FROM table WHERE id = id
correspondra toutes les lignes qui ontid
non nul -
SELECT * FROM table WHERE id = id OR id IS NULL
correspondra toutes les lignes.
id
est probablement une clé primaire, donc vous pouvez probablement utiliser l'ancienne.
Je ne peux décrire ma solution avec un exemple. Le @AllRec
est un paramètre:
Declare @AllRec bit
set @AllRec = {0|1} --as appropriate
SELECT *
FROM table
WHERE
(
id = {{REPLACEME}}
and @AllRec = 0
) OR (
@AllRec = 1
)
Dans cette solution, si @AllRec
est 1 alors tout est retourné, en ignorant le filtre id
. Si @AllRec
est égal à zéro, le filtre est appliqué id
et vous obtenez une ligne. Vous devriez être en mesure d'adapter rapidement cette solution à votre regex actuelle.
En utilisant l'option Remplacer regex vous ouvre à attaques par injection SQL.
En supposant que votre langue a le support des requêtes paramétrées, essayez cette version modifiée de la réponse de Jacob:
SELECT * FROM table WHERE (id = @id OR @id IS NULL)
Le hic est que vous aurez toujours de fournir la valeur @id.
SELECT field1, field2
FROM dbo.yourTable
WHERE id = isnull(@var, id)
Je ne sais pas quelle langue votre utilisation et ce code de genre me fait peur, mais ...
var statement = "SELECT * FROM table";
If REPLACEME is not empty Then
statement += " WHERE id = {{REPLACEME}}"
End If