PSQL - 如何过滤列值是否等于特定字符串

时间:2016-08-08 06:08:24

标签: python postgresql

我使用名为option的列创建了一个数据库,其中值是'Call','Put'或None的varchar。当我设置数据库时,如果没有Call或Put,我将默认值设为None。

我正在尝试过滤掉包含'Call'或'Put'选项的行。但是,当我写查询时

SELECT * FROM holdings h 何处h.option!='呼叫' AND h.option!='Put';

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

当我尝试使用NOT LIKE'%Call%'时,我收到此错误:

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

任何帮助将不胜感激

谢谢!

代码如下所示:

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

编辑: 当我运行这两行时:

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

第一个查询给了我所有带有Call或Put的行,但是当我运行第二个查询时,我什么也得不到,即使它理论上应该给我所有带有None选项的行。有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:3)

在这里看起来像语法错误:

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

字符串1是'SELECT option FROM holdings h WHERE option NOT LIKE ',与'(在%Call%之前)中断,然后是一些名为Call的变量(您的编译器无法找到),然后是字符串2 ';' < / p>

您必须使用反斜杠转义'

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

答案 1 :(得分:0)

声明中存在逻辑错误。你应该写这个:

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

或者这个:

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

感谢。