小编Erw*_*ter的帖子

Postgis几何边界上的两个最近点

我有一个geofences存储geometry多边形的表.

我还有一个A在几何体内部的点.我要做的是找到A位于多边形几何体表面上的点的两个最近点.

PostGIS中的功能:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry
                                        ,decimal lat
                                        ,decimal lon)
  RETURNS VARCHAR AS
$BODY$

DECLARE height DECIMAL;
DECLARE accuracy VARCHAR(250);

BEGIN 

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) As tempName;

CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291
                                        ,28.0808622876029 99.1304006624291
                                        ,100              200
                                        ,23.0808622876029 96.1304006624291
                                        ))'
                              ,0)
              ) AS area; …
Run Code Online (Sandbox Code Playgroud)

postgresql postgis plpgsql

29
推荐指数
1
解决办法
2002
查看次数

PostgreSQL无法在PL/pgSQL中开始/结束事务

我正在寻求澄清如何在plpgsql函数中确保原子事务,以及为数据库的这个特定更改设置隔离级别.

在下面显示的plpgsql函数中,我想确保删除和插入成功.当我尝试将它们包装在一个事务中时,我收到一个错误:
ERROR: cannot begin/end transactions in PL/pgSQL.

如果另一个用户此功能删除了自定义行之后但有机会插入自定义行之前添加了环境的默认行为('RAIN','NIGHT','45MPH'),则执行下面的函数时会发生什么?行?是否存在包含插入和删除的隐式事务,以便在另一个用户更改此函数引用的任一行时回滚它们?我可以为此功能设置隔离级别吗?

create function foo(v_weather varchar(10), v_timeofday varchar(10), v_speed varchar(10),
   v_behavior varchar(10))
   returns setof CUSTOMBEHAVIOR
   as $body$
   begin

      -- run-time error if either of these lines is un-commented

      -- start transaction ISOLATION LEVEL READ COMMITTED;
      -- or, alternatively, set transaction ISOLATION LEVEL READ COMMITTED;


      delete from CUSTOMBEHAVIOR 
      where weather = 'RAIN' and timeofday = 'NIGHT' and speed= '45MPH' ;

      -- if there is no default behavior …
Run Code Online (Sandbox Code Playgroud)

transactions runtime-error plpgsql read-committed postgresql-9.2

29
推荐指数
1
解决办法
3万
查看次数

PostgreSQL - 通过pgAdmin UI创建一个新的数据库

我在我的Ubuntu机器上安装了PostgreSQL数据库服务器.现在我想通过一些GUI应用程序创建一个新的数据库.我尝试了pgAdmin,但没有找到任何创建新数据库的选项.但我可以添加现有的数据库服务器.

有没有办法通过pgAdmin或其他应用程序创建数据库然后表.

基本上我正在寻找像SQLYog for MySQL 这样的PostgreSQL应用程序.

postgresql user-interface pgadmin

28
推荐指数
2
解决办法
8万
查看次数

Postgres查询优化(强制索引扫描)

以下是我的查询.我试图让它使用索引扫描,但它只会seq扫描.

顺便说一下,这个metric_data表有1.3亿行.该metrics表有大约2000行.

metric_data 表格列:

  metric_id integer
, t timestamp
, d double precision
, PRIMARY KEY (metric_id, t)
Run Code Online (Sandbox Code Playgroud)

如何让此查询使用我的PRIMARY KEY索引?

SELECT
    S.metric,
    D.t,
    D.d
FROM metric_data D
INNER JOIN metrics S
    ON S.id = D.metric_id
WHERE S.NAME = ANY (ARRAY ['cpu', 'mem'])
  AND D.t BETWEEN '2012-02-05 00:00:00'::TIMESTAMP
              AND '2012-05-05 00:00:00'::TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

说明:

Hash Join  (cost=271.30..3866384.25 rows=294973 width=25)
  Hash Cond: (d.metric_id = s.id)
  ->  Seq Scan on metric_data d  (cost=0.00..3753150.28 rows=29336784 width=20)
        Filter: ((t >= '2012-02-05 00:00:00'::timestamp without …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing query-optimization postgresql-9.1 postgresql-performance

28
推荐指数
1
解决办法
3万
查看次数

在postgres中的聚合函数中进行DISTINCT ON

对于我的问题,我们有一个架构,其中一张照片有很多标签和许多评论.因此,如果我有一个查询,我想要所有的注释和标记,它会将行相乘.因此,如果一张照片有2个标签和13条评论,我会为这张照片获得26行:

SELECT
        tag.name, 
        comment.comment_id
FROM
        photo
        LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
        LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
        LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这对大多数事情来说都很好,但这意味着如果我GROUP BY和那时json_agg(tag.*),我得到第一个标签的13个副本和第二个标签的13个副本.

SELECT json_agg(tag.name) as tags
FROM
        photo
        LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
        LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
        LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
GROUP BY photo.photo_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

相反,我想要一个只有'郊区'和'城市'的数组,如下所示:

 [
      {"tag_id":1,"name":"suburban"}, 
      {"tag_id":2,"name":"city"}
 ]
Run Code Online (Sandbox Code Playgroud)

我可以json_agg(DISTINCT tag.name),但是当我想要整个行作为json时,这只会产生一个标签名称数组.我想json_agg(DISTINCT ON(tag.name) …

sql postgresql json distinct aggregate-functions

28
推荐指数
4
解决办法
1万
查看次数

在触发器函数中,如何获取正在更新的字段

这可能吗?我有兴趣找出在UPDATE请求中指定了哪些列,而不管正在发送的新值可能是也可能不是已存储在数据库中的值.

我想这样做的原因是因为我们有一个表可以从多个来源接收更新.以前,我们没有记录更新源自哪个来源.现在,该表存储了哪些源执行了最新更新.我们可以更改一些来源以发送标识符,但这不是所有内容的选项.所以我希望能够识别UPDATE请求何时没有标识符,以便我可以替换默认值.

postgresql triggers sql-update

27
推荐指数
2
解决办法
2万
查看次数

PostgreSQL - 如何在不同的时区渲染日期?

我的服务器在中部时间.我想使用东部时间渲染时间戳.

例如,我想呈现2012-05-29 15:00:002012-05-29 16:00:00 EDT.

我怎样才能实现它?

to_char('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')2012-05-29 16:00:00(没有区域).

to_char('2012-05-29 15:00:00'::timestamp at time zone 'EST5EDT', 'YYYY-MM-DD HH24:MI:SS TZ')2012-05-29 14:00:00 CDT(错).

这个有用,但它太复杂了必须有一个更简单的方法: replace(replace(to_char(('2012-05-29 15:00:00'::timestamptz at time zone 'EST5EDT')::timestamptz, 'YYYY-MM-DD HH24:MI:SS TZ'), 'CST', 'EST'), 'CDT', 'EDT')

postgresql timezone datetime

27
推荐指数
1
解决办法
3万
查看次数

PL/pgSQL函数中的可选参数

我正在尝试用可选参数编​​写PL/pgSQL函数.它基于过滤的记录集(如果指定)执行查询,否则对表中的整个数据集执行查询.

例如(PSEUDO CODE):

CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $$
    IF len(optional_list_of_ids) > 0 THEN
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
    ELSE
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
    ENDIF
$$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

实现此功能的正确方法是什么?

顺便说一句,我想知道如何在另一个外部函数中调用这样的函数.我就是这样做的 - 它是正确的,还是有更好的方法?

CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $$
BEGIN
   CREATE TABLE ids AS SELECT id from …
Run Code Online (Sandbox Code Playgroud)

postgresql parameters stored-procedures plpgsql parameter-passing

27
推荐指数
1
解决办法
3万
查看次数

Postgres数据类型转换

我的数据库是Postgres 8.我需要将数据类型转换为另一个.这意味着,列数据类型之一是varchar并且需要intSELECT语句中将其转换为Postgres .

目前,我获取字符串值并将其转换int为Java.
有什么办法吗?示例代码将受到高度赞赏.

java sql postgresql casting

27
推荐指数
1
解决办法
4万
查看次数

SQL查询的函数没有结果数据的目标

我正在尝试创建一个返回SELECTed结果集的函数.当我像这样调用我的postgres函数时,select * from tst_dates_func()我得到一个错误,如下所示:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "tst_dates_func" line 3 at SQL statement

********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "tst_dates_func" line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)

这是我创建的函数:

CREATE OR REPLACE FUNCTION tst_dates_func() …
Run Code Online (Sandbox Code Playgroud)

sql postgresql plpgsql

27
推荐指数
1
解决办法
6万
查看次数