我正在为PostgreSQL创建查看器。我的SQL需要按该列的正常类型进行排序。例如:
表格:
CREATE TABLE contacts (id serial primary key, name varchar)
SQL:
SELECT id::text FROM contacts ORDER BY id;
礼物:
1
10
100
2
好,所以我将SQL更改为:
SELECT id::text FROM contacts ORDER BY id::regtype;
导致的结果:
1
2
10
100
好!但是现在我尝试:
SELECT name::text FROM contacts ORDER BY name::regtype;
这将导致:
invalid type name "my first string"
Google没有帮助。有任何想法吗?谢谢
重复:该错误不是我的问题。我的问题是我需要将每一列都转换为text
,但是要按该列的常规类型进行排序。
答案 0 :(得分:2)
a === 0
是object identifier type,当您不引用系统对象(在这种情况下为类型)时,没有理由使用它。
您应该在第一个查询中将列强制转换为regtype
:
integer
您可以在SELECT id::text
FROM contacts
ORDER BY id::integer;
子句中使用合格的列名。这将适用于任何可排序的列类型。
order by
答案 1 :(得分:1)
因此,我找到了两种方法来实现此目的。首先是通过查询表,然后根据数据构建我自己的查询所提供的解决方案@klin。未经测试的psycopg2示例:
c = conn.cursor()
c.execute("SELECT * FROM contacts LIMIT 1")
select_sql = "SELECT "
for row in c.description:
if row.name == "my_sort_column":
if row.type_code == 23:
sort_by_sql = row.name + "::integer "
else:
sort_by_sql = row.name + "::text "
c.execute("SELECT * FROM contacts " + sort_by_sql)
一种更优雅的方式是这样的:
SELECT id::text AS _id, name::text AS _name AS n FROM contacts ORDER BY id
这使用别名,因此ORDER BY
仍会拾取原始数据。如果没有其他选择,则最后一个选项更具可读性。