【问题标题】:Filtering posgres table based on condition根据条件过滤postgres表
【发布时间】:2020-09-17 10:02:59
【问题描述】:

我已通过 Jupyter 连接到 postgres 表,并尝试使用通过 psycopg2 的连接对其进行过滤。

pd.read_sql_query('''SELECT * 
FROM public."TABLE_NAME"

LIMIT 5''', cnx)

返回表格的前 5 行,但是,我想根据条件进行过滤。

条件只是一个整数

pd.read_sql_query('''SELECT * 

FROM public."TABLE_NAME" 

WHERE TABLE_NAME.COLUMN = 851

LIMIT 5''', cnx)

抛出错误“未定义的列”并暗示我的意思是 TABLE_NAME.COLUMN,这正是我尝试过的。

任何有关如何解决此问题的见解将不胜感激。

【问题讨论】:

  • 错误似乎很清楚,您的表中不存在该列?您还为您的呼叫添加了架构 public 的前缀,但没有在 where 子句中添加前缀,如果您尝试先使用别名 FROM public.[Table Name] t; WHERE t.Column = ... 可能会更好
  • 该列确实存在,即使我转到初始查询并添加 .columns 它也会出现
  • 这不是列或 SQL 的问题,而是在 python 中替换 condition 的问题。
  • 条件只是一个整数
  • 我看到更新的问题。你真的有一个名为 column 的列吗?您是否尝试过给表格起别名? pd.read_sql_query('''SELECT * FROM public."TABLE_NAME" t WHERE t.COLUMN = 851 LIMIT 5''', cnx)

标签: python sql pandas postgresql pgadmin


【解决方案1】:

你需要这样写-(这里 cnx 将是列的值。)

pd.read_sql_query('''SELECT * 
FROM public."TABLE_NAME" 
WHERE TABLE_NAME.COLUMN = %s
LIMIT 5''', cnx)

【讨论】:

  • 你能解释一下这与我尝试过的有什么不同吗?
  • 希望你能看到= %s。基本上这个 %s 将被你在 cnx 中传递的值替换
  • 但是 cnx 是我的连接。用条件(整数)替换它会抛出“int”对象没有属性“光标”
  • 我看到更新的问题。你真的有一个名为 column 的列吗?您是否尝试过给表格起别名? pd.read_sql_query('''SELECT * FROM public."TABLE_NAME" t WHERE t.COLUMN = 851 LIMIT 5''', cnx)
【解决方案2】:

试试这个:

pd.read_sql_query(f'''SELECT * 
FROM public.TABLE_NAME 
WHERE public.TABLE_NAME.COLUMN = {condition}
LIMIT 5''', cnx)

【讨论】:

  • 这产生了一个不同的错误,缺少表的 FROM 子句条目
  • 我编辑了更新的答案,使用了 public.TABLE_NAME.COLUMN = {condition} 的字符串格式,@CarterB 这可能有效
  • 感谢您的帮助。还是一样的错误。作为参考,条件只是一个整数
猜你喜欢
  • 1970-01-01
  • 2022-10-07
  • 2011-07-26
  • 2019-08-03
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多