2016-07-12 16 views
0

Ich habe eine ähnliche Abfrage:anzeigen LIKE Zustand entspricht in einer Spalte

SELECT fname, lname 
FROM names 
WHERE gcode LIKE %5536% OR fname LIKE %3663% 

Es gibt 50 Bedingungen wie diese, und die Bedingungen sind etwas länger, aber das ist die allgemeine Idee. Wir können keine temporären Tische machen, also ist dies der Weg, den wir gehen.

ich machen versuchen, den wie Zustand zurückzukehren, dass die Ausgabe in einer eigenen Spalte abgestimmt auf (dh hat %5536% in einer eigenen Spalte zurückgegeben werden)

ich es programmatisch markieren kann, aber ist es eine Möglichkeit, zu tun das in SQL?

Antwort

5

Sie die Spielbedingungen in einer Sammlung speichern kann:

SELECT n.fname, 
     n.lname, 
     t.COLUMN_VALUE AS match 
FROM name n 
     INNER JOIN 
     TABLE(SYS.ODCIVARCHAR2LIST('%5536%', '%3663%')) t 
     ON (n.gcode LIKE t.COLUMN_VALUE); 
+0

ich darauf hinweisen mag, dass diese mehrere Zeilen für jede 'fname' /' lname' Kombination zurück, wenn Es gibt mehrere Übereinstimmungen. –

+1

@GordonLinoff Das Prinzip bestand darin zu zeigen, dass Sie eine Sammlung verwenden können, um alle Übereinstimmungsbedingungen zu speichern und sie mit der Datentabelle zu vergleichen. Es gibt mehrere Möglichkeiten, die Übereinstimmungsbedingungen in einer einzelnen Spalte zu aggregieren, was kein Problem sein sollte - "LISTAGG()" ist das unmittelbar Offensichtliche. Sie können sogar [die Sammlung als Bindevariable übergeben] (http://stackoverflow.com/a/34699771/1509264), dann müssen Sie die Übereinstimmungsbedingungen in der Abfrage nicht statisch definieren. – MT0

1

Sie können dies in SQL tun. Hier ist eine Methode:

select n.* 
from (select n.*, 
      ((case when gcode LIKE %5536% then '5536;' end) || 
       (case when gcode LIKE %3663% then '3663;' end) || 
       . . . 
      ) as matches 
     from names 
    ) n 
where matches is not null; 
Verwandte Themen