如何在 SQL/PostgreSQL/MySQL 中将“65→67→69”更改为“J7,G2,P9”?还是使用 Pentaho Data Integration (Spoon) 中的拆分字段/值映射器

Posted

技术标签:

【中文标题】如何在 SQL/PostgreSQL/MySQL 中将“65→67→69”更改为“J7,G2,P9”?还是使用 Pentaho Data Integration (Spoon) 中的拆分字段/值映射器来实现?【英文标题】:How to change "65→67→69" to "J7,G2,P9" in SQL/PostgreSQL/MySQL? Or use split fields/value mapper in Pentaho Data Integration (Spoon) to realize it? 【发布时间】:2021-08-24 04:02:34 【问题描述】:

如何在 SQL/PostgreSQL/mysql 中将“65→67→69”改为“J7,G2,P9”?或者使用 Pentaho Data Integration (Spoon) 中的 split fields/value mapper 来实现?

我使用 KETTLE(Pentaho Data Integration/Spoon) 将数据从其他数据库插入到 PostgreSQL,我有一个包含以下数据的字段

  value
 -----------
 65→67→69
 15→19→17
 25→23→45
 19→28→98

ID  value
--------
65  J7
67  G2
69  P9
15  A8
19  b9
17  C1
25  b12
23  e12
45  A23
28  C17
98  F18

以及如何将上面的值更改为下面的值?有没有SQL方式或者KETTLE方式来实现?

  new_value
 -----------
 J7,G2,P9
 A8,b9,C1
 b12,e12,A23
 b9,C17,B18

非常感谢您的建议。

【问题讨论】:

你怎么知道15→19→17中的19指的是b9,但19→28→98中的19指的是B34 @a_horse_with_no_name 很抱歉我的类型错误,只有一个19指的是b9,没有B34 【参考方案1】:

假设这些表:

create table table1 (value text);
insert into table1 (value)
values
  ('65→67→69'),
  ('15→19→17'),
  ('25→23→45'),
  ('19→28→98')
;

create table table2 (id int, value text);
insert into table2 (id, value)
values
  (65, 'J7'),
  (67, 'G2'),
  (69, 'P9'),
  (15, 'A8'),
  (19, 'b9'),
  (17, 'C1'),
  (25, 'b12'),
  (23, 'e12'),
  (45, 'A23'),
  (28, 'C17'),
  (98, 'F18')
;

在 Postgres 中,您可以使用标量子选择:

select t1.value,
       (select string_agg(t2.value, ',' order by t.idx)
        from table_2 t2
          join lateral unnest(string_to_array(t1.value,'→')) with ordinality as t(val,idx) on t2.id::text = t.val
        ) as new_value
from table_1 t1;      

Online example

【讨论】:

非常感谢您的详细回答。

以上是关于如何在 SQL/PostgreSQL/MySQL 中将“65→67→69”更改为“J7,G2,P9”?还是使用 Pentaho Data Integration (Spoon) 中的拆分字段/值映射器的主要内容,如果未能解决你的问题,请参考以下文章

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?