PostgreSQL пустой список VALUES выражение - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь взять список точек и запросить геопространственную базу данных, чтобы найти все подходящие строки.

У меня есть вычисленный оператор SQL, который выглядит следующим образом:

cursor = connection.cursor()
cursor.execute(
    '''
    SELECT g.ident
    FROM (VALUES %s) AS v (lon, lat)
    LEFT JOIN customers g
    ON (ST_Within(ST_SetSRID(ST_MakePoint(v.lon, v.lat), %s), g.poly_home));
    ''', [AsIs(formatted_points), SRID]
)

Вот пример того, как выглядит переменная formatted_points:

(-115.062,38.485), (-96.295,43.771)

Итак, когда она вставляется в выражение SQL, выражение VALUES выглядит так:

(VALUES (-115.062,38.485), (-96.295,43.771)) AS v (lon, lat)

Покахорошо.Однако, когда список точек пуст, выражение VALUES выглядит так:

(VALUES ) AS v (lon, lat)

.., что приводит к тому, что я получаю эту ошибку:

django.db.utils.ProgrammingError: syntax error at or near ")"

Другими словами, (VALUES ) не является допустимым SQL.

Вот вопрос: как мне представить пустой список, используя VALUES?Я мог бы сделать это в особом случае и просто вернуть пустой список, когда этой функции передан пустой список, но это не выглядит очень элегантно.

Я посмотрел на страницу руководства PostgreSQL для ЗНАЧЕНИЙ, но я не понимаю, как создать пустое выражение ЗНАЧЕНИЯ.

1 Ответ

1 голос
/ 09 июля 2019

Если вы можете поместить свои lons и lats в отдельные массивы, вы можете использовать массивы с unnest:

select * from unnest(ARRAY[1, 2, 3]::int[], ARRAY[4, 5, 6]::int[]) as v(lon, lat);
 lon | lat
-----+-----
   1 |   4
   2 |   5
   3 |   6
(3 rows)

select * from unnest(ARRAY[]::int[], ARRAY[]::int[]) as v(lon, lat);
 lon | lat
-----+-----
(0 rows)

Вам придется приводить массивы к соответствующему типу (вероятно, не к int []),Postgres будет угадывать тип, если массивы не пусты, но выдает ошибку, если они пусты, и вы не приводите их к определенному типу.

...