split_part 与 string_to_array

问题

现在想取”按某个字符分割的信息” 字段,比如说: 标签字段,tag = 休闲,娱乐,运动,玩耍, 要取就是”休闲”这个词

第一种方法: string_to_array

select string_to_array('休闲,娱乐,运动,玩耍', ',');
    string_to_array    
-----------------------
 {休闲,娱乐,运动,玩耍}
(1 row)

select tag[1] from ( select string_to_array('休闲,娱乐,运动,玩耍', ',') as tag) a;
 tag  
------
 休闲
(1 row)

但是string_to_array 有个缺陷,就是需要子查询,尤其跟其他自动group by的时候写sql 会非常不爽,所以就想有没有其他方式可以替代,还真如愿了,如下.

第二种方法:split_part

https://www.postgresql.org/docs/10/static/functions-string.html
CTRL + F 搜索 split_part 发现下边的这个例子完全符合需求:

split_part('abc~@~def~@~ghi', '~@~', 2)
def

 select split_part('休闲,娱乐,运动,玩耍', ',', 1) as tag;
 tag  
------
 休闲
(1 row)

完美

### 在 PostgreSQL 中实现 MySQL 的 `SUBSTRING_INDEX` 函数功能 为了在 PostgreSQL 中实现类似于 MySQL 的 `SUBSTRING_INDEX` 函数的功能,可以采用多种替代方案。一种常见的做法是利用 PostgreSQL 自带的字串处理函数来构建类似的逻辑。 #### 使用 `split_part()` 和数组操作 PostgreSQL 提供了强大的字分割和数组处理能力,可以通过这些特性来模拟 `SUBSTRING_INDEX` 的行为。具体来说: 对于正数计数的情况(即获前 N 个子串),可以使用 `string_to_array` 将整个字串按指定分隔拆分为数组,再通过数组切片得所需部分[^5]。 ```sql SELECT array_to_string( (string_to_array('a||b||c||d', '||'))[1:2], '||' ); ``` 这段 SQL 查询会返回 `'a||b'`,相当于执行了 `SUBSTRING_INDEX('a||b||c||d', '||', 2)`。 而对于负数计数的情形,则稍微复杂一些,因为需要先反转数组顺序并选相应位置后再重新组合起来。下面是一个例子展示如何处理这种情况: ```sql WITH parts AS ( SELECT string_to_array('a||b||c||d', '||') AS arr ), reversed_parts AS ( SELECT reverse(arr) AS rev_arr FROM parts ) SELECT array_to_string(reversed_arr[1:abs(-2)], '||') FROM reversed_parts; ``` 此查询的结果将是 `'c||d'`,对应于 `SUBSTRING_INDEX('a||b||c||d', '||', -2)` 的效果[^4]。 另一种更简洁的方法是在单条语句内完成上述过程,比如直接应用 `array_slice` 或者其他内置函数来进行索引计算拼接工作。然而需要注意的是,这种方法可能不如上面提到的方式直观易懂。 除了以上两种方式外,还可以考虑创建自定义函数来封装这种转换逻辑,使得后续调用更加方便统一。例如: ```plpgsql CREATE OR REPLACE FUNCTION substring_index(text, text, integer) RETURNS TEXT LANGUAGE sql IMMUTABLE STRICT AS $$ WITH parts AS ( SELECT unnest(string_to_array($1, $2)) part, generate_series(1, cardinality(string_to_array($1, $2))) idx ) SELECT CASE WHEN $3 >= 0 THEN (SELECT string_agg(part, $2 ORDER BY idx ASC LIMIT $3)) ELSE (SELECT string_agg(part, $2 ORDER BY idx DESC OFFSET abs($3)-1)) END FROM parts; $$; ``` 该 PL/pgSQL 定义允许像在 MySQL 中那样灵活地传入参数,并根据给定的数量决定是从左向右还是从右向左提子串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值