Как выбрать просто значение результата без идентификатора строки и имени столбца для функции в SQL? - PullRequest
0 голосов
/ 18 октября 2018

Я делаю pgRouting и мне нужно вставить целочисленный результат в алгоритм dijkstra из моего SELECT.

SELECT ST_AsGeoJSON(ST_Transform(way, 4326)) AS geometry
  FROM pgr_dijkstra(
'SELECT osm_id AS id, source, target, st_length(way) as cost FROM planet_osm_roads',
34, 3000, false
  ) as di
  JOIN planet_osm_roads pt
  ON di.edge = pt.osm_id ;

Это работает, но если я хочу заменить, например, узел 34 в функции dijkstra на номер узламоей улицы с этим запросом:

SELECT pl.source::integer 
FROM planet_osm_roads pl 
WHERE pl.name LIKE ''street_name'' 
LIMIT 1

И вместе:

SELECT ST_AsGeoJSON(ST_Transform(way, 4326)) AS geometry
  FROM pgr_dijkstra(
'SELECT osm_id AS id, source, target, st_length(way) as cost FROM planet_osm_roads',
'SELECT pl.source::integer FROM planet_osm_roads pl WHERE pl.name LIKE ''street_name'' LIMIT 1',
 3000, false
  ) as di
  JOIN planet_osm_roads pt
  ON di.edge = pt.osm_id ;

Сбой с ошибкой:

ERROR:  function pgr_dijkstra(unknown, unknown, integer, boolean) is not unique
LINE 93:   FROM pgr_dijkstra(
                ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.

Iдумаю, это потому, что мой запрос select возвращает результат sql с идентификатором строки и именем столбца.Но, возможно, есть другая проблема.

Как вывести его только как одно целое число?

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Vertex - целочисленный аргумент, и вы пытались поместить туда текст.Просто измените 'на ()

SELECT ST_AsGeoJSON(ST_Transform(way, 4326)) AS geometry
  FROM pgr_dijkstra('SELECT osm_id AS id, source, target, st_length(way) as cost FROM planet_osm_roads',
(SELECT pl.source::integer FROM planet_osm_roads pl WHERE pl.name LIKE ''street_name'' LIMIT 1),
 3000, false
  ) as di
  JOIN planet_osm_roads pt
  ON di.edge = pt.osm_id ;

Это один из способов, другой - написать функцию с названием улицы в качестве аргумента и аргументом и вашим геоджонсом в качестве вывода.

0 голосов
/ 18 октября 2018

Не передавайте запрос в виде строки:

SELECT ST_AsGeoJSON(ST_Transform(way, 4326)) AS geometry
FROM pgr_dijkstra(
  'SELECT osm_id AS id, source, target, st_length(way) as cost FROM planet_osm_roads',
  (SELECT pl.source::integer FROM planet_osm_roads pl WHERE pl.name LIKE 'street_name' LIMIT 1),
   3000, false
) as di
  JOIN planet_osm_roads pt
  ON di.edge = pt.osm_id;

Или, в качестве альтернативы, используйте производную таблицу

SELECT ST_AsGeoJSON(ST_Transform(way, 4326)) AS geometry
FROM (
  SELECT pl.source::integer as source
  FROM planet_osm_roads pl 
  WHERE pl.name 
  LIKE 'street_name' LIMIT 1
) pl 
  join lateral pgr_dijkstra(
    'SELECT osm_id AS id, source, target, st_length(way) as cost FROM planet_osm_roads',
    pl.source,
    3000, false
  ) as di on true
  JOIN planet_osm_roads pt ON di.edge = pt.osm_id;
...