2016-08-08 9 views
1

Ich erstellte eine Datenbank mit Spalte namens Option, wobei der Wert ein Varchar von "Call", "Put" oder None ist. Als ich die Datenbank eingerichtet habe, habe ich den Standardwert None gesetzt, wenn es keinen Call oder Put gegeben hat.PSQL - Wie herauszufiltern, wenn ein Spaltenwert einer bestimmten Zeichenfolge

Ich versuche, die Zeilen herauszufiltern, die "Call" oder "Put" als Option enthalten. ! Aber wenn ich schreibe die Abfrage

SELECT * FROM Betriebe h WHERE h.option = 'Call' UND h.option = 'Put';

I get this error: 
    curr.execute('SELECT option FROM holdings WHERE option != 'Call';') 
                   ^
SyntaxError: invalid syntax 

Wenn ich versuche zu verwenden NOT LIKE '% Anruf%' bekomme ich diesen Fehler:

curr.execute('SELECT option FROM holdings AS h WHERE option NOT LIKE '%Call%';') 
NameError: name 'Call' is not defined 

Jede mögliche Hilfe

Dank geschätzt!

-Code sieht wie folgt aus:

import psycopg2 
import csv 
conn = psycopg2.connect('dbname = db user = asmith') 
curr = conn.cursor() 
curr.execute('SELECT option FROM holdings h WHERE option NOT LIKE '%Call%';') 
tups = curr.fetchall() 
for tup in tups: 
    print tup 

Edit: Wenn ich laufen diese beiden Zeilen:

curr.execute('SELECT * FROM holdings h WHERE option = \'Call\' OR option = \'Put\';') 
curr.execute('SELECT * FROM holdings h WHERE option != \'Call\' AND option != \'Put\';')                                                                           

Die erste Abfrage gibt mir alle Zeilen mit einer Call- oder Put, aber wenn ich Bei der zweiten Abfrage bekomme ich nichts, obwohl es mir theoretisch alle Zeilen mit der Option None geben sollte. Weiß jemand, warum das so ist?

+0

können Sie den tatsächlichen Fehler einfügen? Das^zeigt auf das Zeichen mit dem Problem. – Mox

+1

Bitte fügen Sie die ganze Zeile Ihres Codes ein. Die SQL-Syntax ist in Ordnung. Ich denke, es gibt ein Problem an anderer Stelle - vielleicht verwenden Sie auch einfache Anführungszeichen außerhalb der Abfrage? Vielleicht versuchen wie: curr.execute ("SELECT Option ....! = 'Call' –

+0

jetzt Ihre Frage ist viel klarer. – Mox

Antwort

3

Sieht aus wie Syntaxfehler hier:

curr.execute('SELECT option FROM holdings h WHERE option NOT LIKE '%Call%';')

String 1 'SELECT option FROM holdings h WHERE option NOT LIKE ' ist, bricht mit ' (vor %Call%), dann einige Variablen mit dem Namen Call (die Ihr Compiler nicht finden können) und dann String 2 ';'

Sie haben ' mit umgekehrten Schrägstrich wie folgt zu entkommen:

curr.execute('SELECT option FROM holdings AS h WHERE option NOT LIKE \'%Call%\';')

+0

Danke! das hat funktioniert! – user3628240

+0

Ich bin mir nicht sicher, ob es eine logische Sache ist, aber wissen Sie, warum setzen: WHERE Option! = \ 'Call \' UND Option! = \ 'Put \' gibt nichts zurück, aber ich will es die Nones zurückgeben. Wenn ich OR anstelle von UND setze, dann gibt es sowohl Aufrufe als auch Eingaben zurück – user3628240

0

Es liegt ein logischer Fehler in der Anweisung vor. Sie sollten dies stattdessen schreiben:

SELECT * FROM holdings h WHERE h.option != 'Call' OR h.option != 'Put'; 

oder dies:

SELECT * FROM holdings h WHERE h.option NOT IN ('Call' , 'Put'); 

Dank.

+0

Ich habe beide ausprobiert und ich bekomme eine Karotte, die auf 'Call' für beide mit ungültiger Syntax zeigt – user3628240

+0

Was ist die Datenbank? Vielleicht sollten Sie stattdessen "<>" versuchen von "! ="? –

+0

'arg! = val1 oder arg!= val2' ist immer 'wahr', außer wenn' arg null ist oder wenn 'val1 = val2'. – Abelisto