Привести столбец PostgreSQL к хранимому типу - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю программу просмотра для 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 голосов
/ 11 сентября 2018

Итак, я нашел два способа сделать это.Первым является решение @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 по-прежнему выбирает исходные данные.Последний вариант более читабелен, если ничего другого.

0 голосов
/ 10 сентября 2018

regtype - это тип идентификатора объекта , и нет никаких оснований использовать его, когда вы не обращаетесь к системным объектам (типы в данном случае).

Вы должны привести столбец к integer в первом запросе:

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

Вы можете использовать полные имена столбцов в предложении order by. Это будет работать с любым сортируемым типом столбца.

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