psql切割函数split_part()

本文探讨了 SQL 中 split_part 函数的使用方法,通过一个具体案例展示了如何从复合字符串中提取特定字段。该函数在处理包含分隔符的字符串时非常有用,能够帮助开发者精确地获取所需的数据部分。
# split_part(string text, delimiter text, field int)

select 
    f_client_source_flag_create,
    split_part(f_client_source_flag_create,'|',1) as client 
from core.t_trans limit 3;

# 结果如下

 f_client_source_flag_create | client
-----------------------------+--------
 3                           | 3
 5||||0|0|                   | 5
 1||||0|0||                  | 1

 

你给出的脚本如下: ```bash psql ${PSQL_DB_CONNECT_STRING} << END_OF_DATA \set ON_ERROR_STOP on ANALYZE ${DB_USER}.${TBL}; / END_OF_DATA ``` --- ## ❌ 问题分析 你遇到的错误是: ``` ERROR: syntax error at or near "ANALYZE" LINE 2: ANALYZE bx01_user.BJ_T_ZEN_RUI2; ``` 我们来分析错误原因和修复方法。 --- ## ✅ 原因 1:`ANALYZE schema.table` 的语法不正确 PostgreSQL 不允许直接写 `ANALYZE schema.table;`,除非你用双引号包裹 schema 和表名。 ### ❌ 错误写法: ```sql ANALYZE bx01_user.BJ_T_ZEN_RUI2; ``` ### ✅ 正确写法: ```sql ANALYZE "bx01_user"."BJ_T_ZEN_RUI2"; ``` --- ## ✅ 原因 2:`/` 是 PL/pgSQL 的执行命令,不是 SQL 语句 你在 SQL 脚本中加了 `/`,这是 psql 的元命令,用于执行上一个匿名代码块(如 `DO $$ ... $$;`)。 但你并没有写任何匿名代码块,所以 `/` 是多余的,会导致语法错误。 --- ## ✅ 原因 3:变量未加引号导致解析错误 在 shell 脚本中,如果你使用 `<< END_OF_DATA`(heredoc)方式传入 SQL,`psql` 实际上是在 shell 中先做变量替换,再传给 PostgreSQL。 如果变量值中包含空格、特殊字符或关键字,会导致 SQL 解析失败。 --- ## ✅ 正确写法(推荐) ### ✅ 方法一:使用双引号包裹 schema 和表名 ```bash psql "${PSQL_DB_CONNECT_STRING}" << END_OF_DATA \set ON_ERROR_STOP on ANALYZE "${DB_USER}"."${TBL}"; END_OF_DATA ``` > ✅ 注意: > > - 使用 `"${DB_USER}"` 和 `"${TBL}"`,确保变量值被正确引用。 > - 删除了多余的 `/`。 > - 使用双引号包裹变量值,防止 PostgreSQL 解析失败。 --- ### ✅ 方法二:设置 `search_path`,避免写 schema 如果你知道当前连接的用户默认 schema 是正确的,也可以省略 schema: ```bash psql "${PSQL_DB_CONNECT_STRING}" << END_OF_DATA \set ON_ERROR_STOP on SET LOCAL search_path TO "${DB_USER}"; ANALYZE "${TBL}"; END_OF_DATA ``` --- ## ✅ 示例完整脚本(带变量) ```bash #!/bin/bash PSQL_DB_CONNECT_STRING="postgresql://bx01_user:bx01_pass@localhost:5432/mydb" DB_USER="bx01_user" TBL="BJ_T_ZEN_RUI2" psql "${PSQL_DB_CONNECT_STRING}" << END_OF_DATA \set ON_ERROR_STOP on ANALYZE "${DB_USER}"."${TBL}"; END_OF_DATA if [ $? -eq 0 ]; then echo "[$(date)] ANALYZE successful." else echo "[$(date)] ANALYZE failed." exit 1 fi ``` --- ## ✅ 小结 | 问题 | 原因 | 解决方案 | |------|------|----------| | `syntax error at or near "ANALYZE"` | schema.table 写法不合法 | 使用双引号包裹 `"bx01_user"."BJ_T_ZEN_RUI2"` | | 多余的 `/` 导致语法错误 | `/` 是 PL/pgSQL 执行命令,非 SQL 语法 | 删除 `/` | | shell 变量未加引号 | 导致 SQL 解析失败 | 使用 `"${DB_USER}"` 和 `"${TBL}"` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值