将PostgreSQL列转换为存储类型

时间:2018-09-10 17:07:56

标签: postgresql postgresql-10

我正在为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,但是要按该列的常规类型进行排序。

2 个答案:

答案 0 :(得分:2)

a === 0object 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仍会拾取原始数据。如果没有其他选择,则最后一个选项更具可读性。