使用PostgreSQL中的关联数组进行批量更新

时间:2015-12-15 23:29:54

标签: sql arrays postgresql sql-update string-parsing

假设我有一个关联数组(用另一种语言定义),如下所示:

mEncoder = MediaCodec.createEncoderByType("video/avc");//MediaCodec.createByCodecName(info.getName());

MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 1920, 1080);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, FPS);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);

mEncoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mEncoder.start();

我有一张这样的桌子:

apply = {
  'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
  'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
  ...
  'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}

如果CREATE TABLE apples ( id integer, name varchar(10), key varchar(10), value varchar(10) ); 位于apples.value变量的一个列表中,我想应用更新,然后将apply设置为数组的键。如果apples.keyapples.value,则将tju设置为apples.key

我目前的方法看起来像这样(将PostgreSQL与任何程序语言混合):

qwer

我想在一个声明中这样做。

1 个答案:

答案 0 :(得分:4)

作为给定示例的概念证明,字符串的格式与您显示的完全一致:

演示准备好的陈述,就像您的客户可能使用的那样。

PREPARE my_update AS
UPDATE apples a
SET    key = upd.key
FROM  (
   SELECT trim (split_part(key_val, ': ', 1), ' ''') AS key
        , string_to_array(translate(split_part(key_val, ': ', 2), '[]''', ''), ', ') AS val_arr
   FROM   unnest(string_to_array(trim($1, E'{}\n'), E'\n')) key_val
   ) upd
WHERE  a.value = ANY(upd.val_arr);

EXECUTE在同一个会话中任意次:

EXECUTE my_update($assoc_arr${
  'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
  'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
  'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}$assoc_arr$);

SQL Fiddle.

相关:

但我宁愿用原始语言处理该类型,并分别传递keyval_arr