将 PostgreSQL 列转换为存储类型

Cast a PostgreSQL column to stored type

我正在为 Postgre 创建一个查看器SQL。我的 SQL 需要根据该列的正常类型进行排序。举个例子:

Table:

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,但按该列的正常类型排序。

regtype 是一个 object identifier type,当您不引用系统对象(在本例中为类型)时,没有理由使用它。

您应该在第一个查询中将列转换为 integer

SELECT id::text 
FROM contacts 
ORDER BY id::integer;

您可以在 order by 子句中使用限定的列名。这将适用于任何可排序类型的列。

SELECT id::text
FROM contacts 
ORDER BY contacts.id;

因此,我找到了两种方法来完成此任务。第一个是@klin 提供的解决方案,通过查询 table 然后根据数据构建我自己的查询。一个未经测试的 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 仍然使用原始数据。如果没有别的,最后一个选项更具可读性。