首页 > 解决方案 > 我的列条目与多个“_”字符混合在一起,如何将第一个“_”之前的数字替换为函数,同时保留其余部分

问题描述

我的列条目中的字符与多个“_”(例如67_0000100-478_NA_d202xz97406_t17199m2156)混合在一起。

使用 SQL(DB 是 Postgres),我只想'_' 用一个函数(例如它的正方形 + 本身)替换第一个之前的数字,同时以相同的方式保留剩余的字符。

当前条目:67_0000100-478_NA_d202xz97406_t17199m2156

期望的输出:4556_0000100-478_NA_d202xz97406_t17199m2156

根据我的研究和探索该平台上有用的密切相关的先前回答的问题,我认为大多数问题案例是在文本条目仅出现一次字符时替换/删除某些文本。

到目前为止我的进展(根据建议的评论更新),但是我收到语法错误(我不是 SQL 专家):

CREATE OR REPLACE VIEW public.v_events AS
SELECT uid, serial_id, session_id, start_time, code, event_name, end_timestamp, temp_code
FROM public.events_data
update public.v_events
    set uid = concat(
                       (split_part(uid, '_', 1))::int^2 + (uid), 
                       substr(uid, strpos(uid, '_')))

注意:uid 是要替换为函数的列条目(uid^2 + uid)。我知道可以在 SQL 中使用 Power() 来完成。

我需要做的是创建原始表(public.events_data)的视图(public.v_events),并仅用不同的函数(uid^2 + uid)替换第一个'_'(例如67)之前的数字。

我真的很感谢任何人的帮助?

标签: sqlpostgresqlfunctionreplace

解决方案


可以获得第一个元素的平方,例如使用split_part()它可以与字符串的其余部分连接:

update the_table 
    set the_column = concat(
                       (split_part(the_column, '_', 1))::int^2, 
                       substr(the_column, strpos(the_column, '_'))
                     )

(split_part(the_column, '_', 1))::int_以整数形式返回第一个字符串之前的字符串。如果无法将值转换为 int,则会导致错误。

如果您不想更改表,请在 SELECT 语句中使用该表达式:

SELECT concat((split_part(uid, '_', 1))::int^2 + (uid), 
               substr(uid, strpos(uid, '_'))) as uid, 
       serial_id, 
       session_id, start_time, code, event_name, end_timestamp, temp_code
FROM public.events_data

推荐阅读