postgre的数组使用

   今天受益匪浅,抛砖引出了大神的玉。

   我的砖如下:

   A表,字段有id,name和words,words字段以"|"为分隔符,如下:

  

   B表,字段为words和numbers,但是words字段有所不同,具体如下:

    

    需求为:通过表B中的“董事”或者“投资”或者“债券”或者其他词,此处我们默认按B表的number字段排序,limit3,然后去表A匹配出包含它们的记录。

    开发同事表示,如果先从B表把words取出来,然后在后台循环列表,比较麻烦,能否在一个sql语句中把记录查出来?

    我思考了一下,觉得用数组可以解决,于是语句如下:

select * from A
where words like '%'||(select b[1] from (
select array(select words from B order by number desc limit 3) as b
) a)||'%' 
or words  like '%'||(select b[2] from (
select array(select words from B order by number desc limit 3) as b
) a)||'%' 
or words  like '%'||(select b[3] from (
select array(select words from B order by number desc limit 3) as b
) a)||'%' limit 6

    子查询为select array(select words from B order by number desc limit 3),即先把前三个组成数据,然后取别名为b,再分别取b中值拼接like语句,最终达成效果。

    实现是实现了,但是语句很丑。

   大神看到后说,PG给数组提供一堆数组操作相关的函数和操作符,以及索引方法

   其实使用数组的操作符,就可以解决,语句如下:

    select * from A where regexp_split_to_array(words,'\|') && array(select words::text from B order by number desc limit 3);

   简洁,高效。

   如果把A表的words字段类型改为数组类型,再建立gin或者gist索引,以后数据量大了,效率也会更高。

### PostgreSQL 中 LATERAL 关键字的用法 在 PostgreSQL 中,`LATERAL` 关键字用于执行依赖于外部查询结果的子查询。这使得可以在 `FROM` 子句中引用前面定义的表表达式中的列。 #### 基本语法 当使用 `LATERAL` 时,可以将它放在 `JOIN` 或者作为单独的表项来指定。其基本形式如下: ```sql SELECT * FROM table_name_1 t1, LATERAL (subquery referencing columns from t1) AS sub; ``` 或者更常见的写法是通过显式的 `JOIN ... ON TRUE` 来实现: ```sql SELECT * FROM table_name_1 t1 CROSS JOIN LATERAL (subquery referencing columns from t1) AS sub; ``` 这里的关键在于子查询能够访问到左侧表格的数据行,从而允许更加灵活复杂的操作[^1]。 #### 实际案例分析 假设有一个名为 `orders` 的订单表以及一个包含多个商品 ID 列表的商品详情表 `product_ids_per_order` 。为了获取每个订单对应的全部产品信息,可以利用 `LATERAL` 进行连接并展开这些列表: ```sql CREATE TABLE orders ( order_id int PRIMARY KEY, customer text NOT NULL ); INSERT INTO orders VALUES (10, 'Alice'), (20, 'Bob'); CREATE TABLE product_ids_per_order( order_id int REFERENCES orders(order_id), products integer[] ); INSERT INTO product_ids_per_order VALUES (10, '{100, 101}'), (20, '{200}'); ``` 现在要得到每条记录对应的具体产品编号,则可以通过下面的方式完成: ```sql SELECT o.order_id, p.product_id FROM orders o LEFT JOIN LATERAL unnest((SELECT products FROM product_ids_per_order WHERE order_id = o.order_id)) AS p(product_id) ON true; ``` 这段代码会返回如下所示的结果集: |order_id |product_id| |---------|----------| | 10| 100 | | 10| 101 | | 20| 200 | 在这个例子中,`unnest()` 函数被用来把数组拆分成多行数据;而 `LATERAL` 让我们能够在同一个查询语境下处理这种一对多的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值