将 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
仍然使用原始数据。如果没有别的,最后一个选项更具可读性。
我正在为 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
仍然使用原始数据。如果没有别的,最后一个选项更具可读性。