2010-11-19 15 views
1

So .. Ich dachte, ich wüsste mssql ziemlich gut, aber diese eine Abfrage von mir heute gefragt hat mich perplex. Grundsätzlich verwendet ein Stück Code irgendwo die LIKE-Klausel, um zu bestimmen, wie bestimmte Werte gefiltert werden. Ich muss darauf hinweisen, dass dies nicht geändert werden kann, wir können die Abfrage nicht ändern, um NOT LIKE zu verwenden. Aber was wenn ich das machen möchte? Betrachten Sie folgendes Beispiel:SQL LIKE nicht/^ Operator und mehrere Zeichen

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]_' 

Nun .. wie kann die WHERE modifiziert werden alles außer 1.4A zurückzukehren? Sie können [^ 4A] oder sogar [^ 4] [^ A] aus offensichtlichen Gründen nicht tun. Ist das etwas, das ohne NOT LIKE einfach nicht möglich ist? Oder verpasse ich hier etwas und gerade am Freitag, um es zu realisieren?

+1

Nur aus Neugier heraus, warum kann; t Sie die Abfrage ändern mögen verwenden NICHT? – HLGEM

+0

Weil der Code in einer anderen Komponente ist. Im Grunde ist das einzige, was ich den Code bereitstellen kann, der Wert für die LIKE-Klausel als String. Ich könnte ungezogen sein und etwas zusätzliches SQL einbringen: z.B. String likeArg = "'%' UND ColName NOT = '1.4A'" Aber ich weiß, dass die Spaltennamen dynamisch sind .. also auch dort verschraubt ... – MRAH

Antwort

2

Wenn Sie den Ausdruck nur nach LIKE ändern können, können Sie dies nicht mit einfachen LIKE tun.

Sie brauchen nicht wie oder zumindest. Sie benötigen die passende Leistung von Regular Expression, die in SQL Server nicht einfach verfügbar ist.

1

Ist der Code SQL-Injection sicher? Weil ich Injektion als die einzige Möglichkeit sehe, dies zu tun. Normalerweise haben nur _ und % eine Bedeutung in den LIKE Operanden.

0

Wenn es wirklich nur die 4A Sie ausschließen suchen, dann:

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

Ich nahm an, OP ist auf einen einzigen "LIKE beschränkt "basierend auf Kommentar – gbn