postgresql 数据库操作点记

本文概述了如何在PostgreSQL中进行普通查询、结果拼接,排除特定字段,处理时间数据,安装扩展、生成UUID,以及进行空间查询和数据操作,包括创建、删除、导入导出和复杂查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通查询

查询结果拼接

	select string_agg(field)
    1.一行数据中的 多字段值根据连接符拼接
    concat_ws(':',aaa,bbb)  或者  ||
    2.几行数据中的 同一 单字段值根据连接符拼接
    string_agg(ccc,' \r\n ')
    3.如果要将多个字段的值拼接成一个:
    string_agg(concat_ws(':',aaa,bbb),' \r\n ' order by aaa asc) as xxx

查询所有字段 排除某些字段

    SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
          FROM information_schema.columns As c
            WHERE table_name = '$tablename' 
            AND  c.column_name NOT IN('createdat', 'updatedat', 'deletedat','geom')
    ), ',') || ',ST_AsText (geom) AS geom FROM $tablename As o WHERE o.deletedat IS NULL' As sqlstr

处理时间

https://blog.csdn.net/snn1410/article/details/7741283

查询结果去除null值

SELECT  coalesce(wendushis,'') as wendushis,coalesce(yalishis,'') as yalishis,coalesce(yeweiss,'') as yeweiss,coalesce(liuliang,'') as liuliang  FROM equip_risksource where deletedat is NULL AND equipid = '$equipid'

安装扩展 自动填充uuid

    -- Extension: "uuid-ossp"
    -- DROP EXTENSION "uuid-ossp";
     CREATE EXTENSION uuid-ossp
      SCHEMA public
      VERSION "1.0";
    使用时 字段默认值为 uuid_generate_v4()

数据库插入guid函数

    CREATE OR REPLACE FUNCTION "public"."new_guid"()
     RETURNS "pg_catalog"."varchar" AS $BODY$   

    DECLARE   
    
      v_seed_value varchar(32);   
    
    BEGIN   
    
    select   
    
    md5(   
    
    inet_client_addr()::varchar ||   
    
    timeofday() ||   
    
    inet_server_addr()::varchar ||   
    
    to_hex(inet_client_port())   
    
    )   
    
    into v_seed_value;
    return (substr(v_seed_value,1,8) || '-' ||   
    
            substr(v_seed_value,9,4) || '-' ||   
    
            substr(v_seed_value,13,4) || '-' ||   
    
            substr(v_seed_value,17,4) || '-' ||   
    
            substr(v_seed_value,21,12));   
    
    END;   
    
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER  COST 100
    ;
    
    ALTER FUNCTION "public"."new_guid"() OWNER TO "postgres";
    

清空表格数据

    TRUNCATE tablename RESTART IDENTITY

分组查询的GroupBy

    SELECT column-list  
    FROM table_name  
    WHERE [conditions ]  
    GROUP BY column1, column2....columnN  
    ORDER BY column1, column2....columnN  

添加字段 修改字段

    alter table equip_pipelinemanager add column texturemateria  VARCHAR(100);
    COMMENT ON COLUMN equip_pipelinemanager.texturemateria IS '管线材质';
    
    ALTER TABLE equip_risk alter status  type int USING status::int;

获取字段名、类型、注释、是否为空:

    SELECT col_description(a.attrelid,a.attnum) as comment,format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnull FROM pg_class as c,pg_attribute as a where c.relname = 'equip_linemanagement' and a.attrelid = c.oid and a.attnum>0

数据库创建删除导入导出

    创建:createdb -U postgres -h 127.0.0.1 -p 5432 -e base_equipment
    删除:dropdb -U postgres -h 127.0.0.1 -p 5432 -e base_equipment
    导入:psql -h 127.0.0.1 -p 5432 -d base_equipment -U postgres -f F:\sqldata\jilin\base_equipment.sql
    导出:pg_dump -U postgres -h 127.0.0.1 -p 5432  -f F:\sqldata\jilin\base_equipment.sql base_equipment

postgresql 查询批更新

    INSERT INTO public_user (SELECT useraccount, password, username, userlevel,NULL,NULL,now(),now(),deletedat,userid,useraccount,'001' FROM pub_user)
    UPDATE tb1 SET c1=b.c1 c2=b.c2 FROM b WHERE tb1.c3 = b.c3 AND tb1.c4 = b.c4
    自更新
    UPDATE pdfhots SET pdfurl=replace(pdfhots.pdfurl,'10.177.6.192','10.177.5.3')

postgresql 查询批量插入

    INSERT INTO public_user (SELECT useraccount, password, username, userlevel,NULL,NULL,now(),now(),deletedat,userid,useraccount,'001' FROM pub_user)

    第二个例子
    INSERT INTO hotsrelation(hotid,relatedotherobjecttype,relatedotherobjectid) SELECT hotid,relatedotherobjecttype,relatedotherobjectid FROM hotsrelation1

postgresql 字段类型查询 转换

     select CAST('5' as char),CAST('2015-10-10' as char),CAST('e10adc3949ba59abbe56e057f20f883e' as uuid);

postgresql删除活动链接的数据库 2019-4-28

    SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname='base_graphdb1' AND pid<>pg_backend_pid();

匹配操作

    不区分大小写模糊匹配:~* 'aa'
    左侧匹配:~ '^aa'

设置自增主键

    #表public_pdfsearch已建好  主键为id
    CREATE SEQUENCE public_pdfsearch_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
    alter table public_pdfsearch alter column id set default nextval('public_pdfsearch_id_seq');

查询不区分大小写,去除重复记录,分组

    # ilike 关键字不区分大小写
    # distinct on (字段) 去除字段列的重复记录
    select distinct on (filepath)  filename,filepath,pages from public_pdfsearch  where context ilike '%IA344%' or imgtext ilike '%IA344%' or filename ilike '%IA344%'  limit 50 
    #分组
    select public_pdfsearch.filepath,   count(*) as num from public_pdfsearch  where context ilike '%陈%' or imgtext ilike '%陈%' or filename ilike '%陈%' GROUP BY filepath  ORDER BY num DESC

创建gin索引


     CREATE EXTENSION pg_trgm;
    CREATE INDEX ix_gallery_map_author ON gallery_map USING gin (author gin_trgm_ops);
    EXPLAIN ANALYZE select * from gallery_map where author like '曹%';   QUERY PLAN

postgresql 获取汉字首字母函数

创建函数

CREATE OR REPLACE FUNCTION CnFirstChar(s character varying)
 RETURNS character varying AS
$BODY$
declare
 retval character varying;
 c character varying;
 l integer;
 b bytea; 
 w integer;
begin
l=length(s);
retval='';
while l>0 loop
 c=left(s,1);
 b=convert_to(c,'GB18030')::bytea;
 if get_byte(b,0)<127 then
 retval=retval || upper(c);
 elsif length(b)=2 then
 begin
 w=get_byte(b,0)*256+get_byte(b,1);
 --汉字GBK编码按拼音排序,按字符数来查找,基于概率来说,效率应该比挨个强:)
 if w between 48119 and 49061 then --"J";48119;49061;942
 retval=retval || 'J';
 elsif w between 54481 and 55289 then --"Z";54481;55289;808
 retval=retval || 'Z';
 elsif w between 53689 and 54480 then --"Y";53689;54480;791
 retval=retval || 'Y';
 elsif w between 51446 and 52208 then --"S";51446;52208;762
 retval=retval || 'S';
 elsif w between 52980 and 53640 then --"X";52980;53640;660
 retval=retval || 'X';
 elsif w between 49324 and 49895 then --"L";49324;49895;571
 retval=retval || 'L';
 elsif w between 45761 and 46317 then --"C";45761;46317;556
 retval=retval || 'C';
 elsif w between 45253 and 45760 then --"B";45253;45760;507
 retval=retval || 'B';
 elsif w between 46318 and 46825 then --"D";46318;46825;507
 retval=retval || 'D';
 elsif w between 47614 and 48118 then --"H";47614;48118;504
 retval=retval || 'H';
 elsif w between 50906 and 51386 then --"Q";50906;51386;480
 retval=retval || 'Q';
 elsif w between 52218 and 52697 then --"T";52218;52697;479
 retval=retval || 'T';
 elsif w between 49896 and 50370 then --"M";49896;50370;474
 retval=retval || 'M';
 elsif w between 47297 and 47613 then --"G";47297;47613;316
 retval=retval || 'G';
 elsif w between 47010 and 47296 then--"F";47010;47296;286
 retval=retval || 'F';
 elsif w between 50622 and 50905 then--"P";50622;50905;283
 retval=retval || 'P';
 elsif w between 52698 and 52979 then--"W";52698;52979;281
 retval=retval || 'W';
 elsif w between 49062 and 49323 then--"K";49062;49323;261
 retval=retval || 'K';
 elsif w between 50371 and 50613 then --"N";50371;50613;242
 retval=retval || 'N';
 elsif w between 46826 and 47009 then--"E";46826;47009;183
 retval=retval || 'E';
 elsif w between 51387 and 51445 then--"R";51387;51445;58
 retval=retval || 'R';
 elsif w between 45217 and 45252 then --"A";45217;45252;35
 retval=retval || 'A';
 elsif w between 50614 and 50621 then --"O";50614;50621;7
 retval=retval || 'O';
 end if;
 end;
 end if;
 s=substring(s,2,l-1);
 l=l-1;
end loop;
return retval;
end;
$BODY$
 LANGUAGE plpgsql IMMUTABLE;

使用方法

SELECT
 enumvalue,
 CnFirstChar(enumvalue) as firstChar 
FROM
 field_enum_list
WHERE
 tablename = 'equip_interplantpipeline'
AND filedname = 'pipenet'
ORDER BY
 firstChar

CASE WHEN

SELECT 
    CASE
    WHEN filename ~* 'F001' THEN
        2.4
    ELSE
        1.5
    END AS weight
    FROM
        equip_filemap
    

postgis 空间查询

修改空间字段类型 2019-4-25

    alter table underline alter geom type geometry(MultiLineString)
    
    alter table equip_riskmap alter COLUMN risklevel type int using risklevel::int

查询坐标点,空间信息转坐标点

select ST_AsText(geom)

两个几何要素是否相交

ST_Intersects(e.geom, r.geom)

计算两点间的欧式距离

SELECT st_distance(geometry('POINT(115.967054194395 39.7315610991521)')::geography,geometry('POINT(115.96694062267 39.731557951387)')::geography)

判断点是否在面内

ST_Contains(polygon.geom,point.geom)

判断两个几何对象是否是重叠

 ST_Overlaps(geometry, geometry)

判断两个几何对象是否互相穿过

ST_Crosses(geometry, geometry)

验证几何图形是否有效

ST_MakeValid(geom)

构建线

ST_LineFromText("linestring(115.99595273353 39.716924496395,115.99633092501 39.716964729531,115.99626655199 39.716835983498,115.9960600219 39.716846712334,115.99595273353 39.716924496395)")

构建多边形

ST_MPolyFromText("multipolygon(((115.99595273353 39.716924496395,115.99633092501 39.716964729531,115.99626655199 39.716835983498,115.9960600219 39.716846712334,115.99595273353 39.716924496395)))")

获取切割图形

st_split(ST_MakeValid(inputgeom),bable)--第一个参数为被切图行

获取中心点

ST_Centroid(geom)

获取相交部分

ST_Intersection(geom,geom)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值