pgsql 字符串转数组关联其他表,匹配 拼接后原顺序展示

本文介绍了如何使用 SQL 通过 unnest 和 with ordinality 函数将邮件配置表中的 email_user_id 字段转换为用户姓名和ID的有序列表,并保持原始顺序。通过 left join 和 string_agg 函数实现了所需的效果。

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

实现原理:

1.unnest(string_to_array(mnc.email_user_id , ','))字符串转数组 在转成行然后进行匹配

2.WITH ORDINALITY a(user_id, nr)此函数用于显示下标,便于后边排序

3.匹配后按原顺序聚合即可

源数据如下图红框中

 想要实现的效果如下(顺序一致)

 实现的sql如下

select
	string_agg(b.user_name || '(' || b.user_id || ')', ',')as emailUserName ,
	b.email_user_id
from
	(
	select
		su.user_name,
		su.user_id ,
		mnc.*
	from
		fas_mail_notification_config mnc,
		unnest(string_to_array(mnc.email_user_id , ','))with ordinality a(user_id,nr)
	left join sec_user su on a.user_id = su.user_id
	where
		mnc.delete_flg = 0
		and mnc.bg_id = '49bd50924c434556aca0193bcffb2dce'
		and mnc.business_type = '1'
	order by
		mnc.id,
		mnc.bg_id ,
		a.nr
      )b
group by
	b.id,
	b.bg_id,
	b.email_user_id

### PostgreSQL 中字符串转数函数 `string_to_array` 的使用 在 PostgreSQL 中,可以使用内置函数 `string_to_array` 将字符串按照指定的分隔符拆分为数。该函数接受两个参数:第一个是要处理的字符串,第二个是用于分割字符串的分隔符。 以下是具体的语法和示例: #### 语法 ```sql string_to_array(text, delimiter [, null_string ]) ``` - **text**: 要转换为数的目标字符串。 - **delimiter**: 指定用来分割字符串的分隔符。 - **null_string (可选)**: 如果某个子字符串等于此值,则会被视为 NULL 值。 #### 示例代码 以下是一些常见的用法示例: 1. **基本用法** ```sql SELECT string_to_array('A,B,C,D', ','); ``` 输出结果是一个数 `{A,B,C,D}`[^3]。 2. **带有空值的情况** 当某些部分为空时,可以通过设置第三个参数来控制如何处理这些空值: ```sql SELECT string_to_array('A,,C,', ',', ''); ``` 结果会返回一个包含 NULL 值的数 `{A,NULL,C,NULL}`。 3. **复杂场景下的应用** 对于更复杂的字符串,也可以正常工作: ```sql SELECT string_to_array('apple|banana|cherry', '|'); ``` 返回的结果将是 `{apple,banana,cherry}`。 4. **结合其他操作** 可以与其他 SQL 函数一起使用,比如提取特定位置的元素: ```sql SELECT (string_to_array('X,Y,Z,W', ','))[3]; ``` 这里 `(string_to_array(...))[3]` 示获取数中的第 3 个元素,最终输出为 `Z`[^3]。 --- ### 注意事项 - 分隔符的选择非常重要,如果分隔符不存在于目标字符串中,整个字符串将作为单个元素放入数中。 - 若输入字符串本身即为空 (`NULL`) 或者长度为零 (""),那么返回的是一个空数 `{}`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值