2010-11-19 28 views
1

Alors .. Je pensais que je connaissais mssql assez bien, mais cette requête m'a demandé aujourd'hui m'a perplexe. Fondamentalement, un morceau de code quelque part utilise la clause LIKE pour déterminer comment filtrer certaines valeurs. Je dois souligner que ceci ne peut pas être changé, nous ne pouvons pas modifier la requête pour utiliser NOT LIKE. Mais que faire si c'est ce que je veux faire? Considérez cet exemple:SQL LIKE pas/^ opérateur et plusieurs caractères

select * from 
(
select '1.2A' as num 
union 
select '1.3A' as num 
union 
select '1.4A' as num 
union 
select '1.4B' as num 
union 
select '1.5A' as num 
) as test 
where num like '1.[^4]_' 

Maintenant ... comment l'emplacement peut-il être modifié pour renvoyer tout sauf 1.4A? Vous ne pouvez pas faire [^ 4A] ou même [^ 4] [^ A] pour des raisons évidentes. Est-ce quelque chose qui est simplement impossible à faire sans utiliser NOT LIKE? Ou est-ce que j'ai manqué quelque chose ici et juste vendredi pour le réaliser?

+1

par curiosité pourquoi ne; t vous modifiez la requête ne PAS utiliser comme? – HLGEM

+0

Parce que le code est dans un autre composant. Fondamentalement, la seule chose que je peux fournir le code est la valeur de la clause LIKE en tant que chaîne. Je pourrais être méchant et injecter du SQL supplémentaire: par ex. String likeArg = "'%' ET ColName NOT = '1.4A'" Mais je sais pertinemment que les noms de colonne sont dynamiques .. donc vissés là aussi ... – MRAH

Répondre

2

Si vous ne pouvez changer l'expression qu'après LIKE, alors vous ne pouvez pas le faire avec LIKE simple.

Vous n'auriez pas besoin d'aimer ou OU au moins. Vous auriez besoin de la puissance correspondante de l'expression régulière qui n'est pas disponible facilement dans SQL Server.

1

Le code est-il sûr pour l'injection SQL? Parce que je vois l'injection comme le seul moyen de le faire. Habituellement, seulement _ et % ont une signification dans les opérandes LIKE.

0

S'il est vraiment juste 4A vous cherchez à exclure, puis:

select * from 
(
select '1.2A' as num 
union 
select '1.3A' as num 
union 
select '1.4A' as num 
union 
select '1.4B' as num 
union 
select '1.5A' as num 
) as test 
where num like '1.[0-9]_' 
    and RIGHT(num,2)<> '4A' 
+0

Je suppose que OP est limité à un seul "LIKE" "basé sur le commentaire – gbn