2016-05-06 8 views
1

Ich habe ein Dataset, das einige Kommentare hat, die Themen ausschließen würde. Ich möchte einen Mini-Datensatz erstellen, um diese Themen zu sammeln.SAS SQL: WHERE LIKE 'Liste der Wörter'

Ich versuche, für die SAS SQL zu verwenden, so habe ich versucht, dies zu tun:

PROC SQL; 
     CREATE TABLE EXCLUDE as 
     SELECT * 
     FROM data_set 
     WHERE UPCASE(COMMENT) like '%(INELIGIBLE | REFUSED)%'; 
QUIT; 

Ich habe auch versucht

PROC SQL; 
    CREATE TABLE exclude as 
    SELECT * 
    FROM Data_set 
     WHERE UPCASE(COMMENT) like ('%INELIGIBLE%'|'%REFUSED%') 
    ; 
QUIT; 

ich immer einen Fehler bekommen, die sagt ‚LIKE Operator verlangt Charakter Operanden

Wie kann ich dies eine richtige Syntaxabfrage machen?

Dank

+0

Was wollen Sie? Kommentare ein-/ausschließen, die 'Ineligible' und 'Refused' enthalten? In diesem Fall brechen Sie einfach mit dem Operator "LIKE" in "OR"/"AND" -Anweisungen auf. – Parfait

+0

Der Operator like ist nicht für reguläre Ausdrücke. –

Antwort

4

Sie könnten es tun, über eine gleich beitreten gegen eine Liste der Begriffe auszuschließen:

 
data words ; 
    input word $char16. ; 
datalines ; 
INELIGABLE 
REFUSED 
; 
run ; 

proc sql ; 
    create table exclude as 
    select a.* 
    from data_set a 
     left join 
     words b on upcase(a.comment) like cats('%',b.word,'%') 
    where missing(b.word) ; 
quit ; 
1

Sie Perl reguläre Ausdrücke, dies zu tun können, wenn Sie mit einem String arbeiten, die bereits gebildet ist. (Wenn nicht, sind Sie besser dran, nur die separate Syntax schreiben, PRXs langsam sind.)

Equivalent Code hier ein ausgeschrieben, eine mit einem PRX einen einzelnen String mit:

proc sql; 
    select * 
    from sashelp.class 
    where not (name like 'A%' or name like 'B%'); 
quit; 


proc sql; 
    select * 
    from sashelp.class 
    where not (prxmatch('~^[A|B]~io',name)); 
quit; 
+0

Ich habe noch nie Perle verwendet. Was bedeutet ~? –

+0

Das '~' Zeichen dort ist nur der Regex-Begrenzer – Joe

2

SQL tut habe keine volle Unterstützung für reguläre Ausdrücke. In SAS können Sie prxmatch() verwenden. Aber können Sie dies auch in SQL:

PROC SQL; 
    CREATE TABLE EXCLUDE as 
     SELECT * 
     FROM data_set 
     WHERE UPCASE(COMMENT) like '%INELIGIBLE%' OR 
       UPCASE(COMMENT) like '%REFUSED)%'; 
    QUIT; 

Hinweis: Dies wird nicht einen Index für comment verwenden.

0

hier eine andere Lösung ist, mit contains, wo die Suchbegriffe aus einem Datensatz kommt (was sein kann, zB aus einer externen Datei lesen). Ich mag das wegen seiner Portabilität.

Proc sql noprint; 
     select 'Upcase(Comment) contains '''||strip(Upcase(term))||'''' 
     into :strings separated by ' or ' 
     from exclusion_terms 
     order by 1; 

     create table Excluded as 
     select * 
     from Data_set 
     where &strings; 
Quit; 

Hier ist der erste Abschnitt erstellt die Makrovariable string aus dem Datensatz des Ausschlusses Begriffe, die dann verwendet wird, um die ausgeschlossenen Daten-Set zu erstellen.

Die hartcodierte Version Version von Suchbegriffen Contains mit:

Proc Sql; 
     create table Excluded as 
     select * 
     from Data_set 
     where Upcase(Comment) contains ('INELIGIBLE' OR 'REFUSED'); 
Quit;