postgresql 根据列的整数值展开行,同时分析剩余列中的值,以分隔插入行中的值

rn0zuynd  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(96)

我需要的是根据列中的整数值插入行,同时解析其余列中的值,以便在新插入的行中分隔它们的值。
我有一张这样的table
| 识别码|家庭|使用者计数|显示1|显示2|显示3|显示4|
| - -|- -|- -|- -|- -|- -|- -|
| 一百二十三|1号房|2个|射手|暗色|||
| 小行星一千二百三十四|第二栋|四个|清醒|箭头|卢|厄扎克|
我需要一个展开的表,其中每行代表一个单独的用户
| 识别码|家庭|使用者计数|显示1|显示2|显示3|显示4|
| - -|- -|- -|- -|- -|- -|- -|
| 一百二十三|1号房|一个|射手||||
| 一百二十三|1号房|一个||暗色|||
| 小行星一千二百三十四|第二栋|一个|清醒||||
| 小行星一千二百三十四|第二栋|一个||箭头|||
| 小行星一千二百三十四|第二栋|一个|||卢||
| 小行星一千二百三十四|第二栋|一个||||厄扎克|
我需要使用Google企业应用套件脚本或PostgreSQL解决此问题。

r3i60tvu

r3i60tvu1#

在您的情况下,当使用Google Apps脚本时,下面的示例脚本如何?

示例脚本:

请将以下脚本复制并粘贴到电子表格的脚本编辑器中,然后保存脚本。并且,请设置源工作表和目标工作表名称。

function myFunction() {
  const srcSheetName = "Sheet1"; // Please set source sheet name.
  const dstSheetName = "Sheet2"; // Please set source sheet name.

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(srcSheetName);
  const [header, ...values] = sheet.getDataRange().getValues();
  const res = [header, ...values.flatMap(([a, b, c, ...d]) => {
    const len = d.length;
    return [...Array(c)].map((_, i) => {
      const temp = [...Array(i).fill(null), d[i]];
      return [a, b, 1, ...temp, ...Array(len - temp.length).fill(null)];
    });
  })];
  ss.getSheetByName(dstSheetName).getRange(1, 1, res.length, res[0].length).setValues(res);
}
  • 执行此指令码时,会从来源工作表撷取值,并转换值,然后将转换后的值放入目的工作表。在此情况下,当使用范例输入数据表时,就可以取得范例输出数据表。
  • 如果你想把这个脚本作为一个自定义函数,下面的示例脚本怎么样?当你的显示输入表被使用时,请把一个自定义函数,如=SAMPLE(A1:G3)放到一个单元格中。这样,结果值就被返回了。
function SAMPLE(v) {
    const [header, ...values] = v;
    return [header, ...values.flatMap(([a, b, c, ...d]) => {
      const len = d.length;
      return [...Array(c)].map((_, i) => {
        const temp = [...Array(i).fill(null), d[i]];
        return [a, b, 1, ...temp, ...Array(len - temp.length).fill(null)];
      });
    })];
  }

注:

  • 此示例脚本是根据示例输入表和输出表准备的。因此,当您更改表或实际的电子表格与示例输入表不同时,脚本可能无法使用。请注意这一点。

参考编号:

相关问题