Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据sql表的列值在其内部插入行_Sql_Postgresql_Sql Insert - Fatal编程技术网

根据sql表的列值在其内部插入行

根据sql表的列值在其内部插入行,sql,postgresql,sql-insert,Sql,Postgresql,Sql Insert,我有一个包含多个列的表文件,其中一个是val,它是由3个属性组合而成的版本、名称和可用性所有三个属性都与组合在一起并存储在val中。现在我必须插入3行,处理所有数据和值,即 id file_id file_version_id val type 162 190234 259 1.2;DESC;AVAIL desc ==========================================

我有一个包含多个列的表
文件
,其中一个是
val
,它是由3个属性组合而成的
版本、名称和可用性
所有三个属性都与
组合在一起并存储在
val
中。现在我必须插入
3行
,处理所有数据和值,即

id    file_id   file_version_id   val                  type

162   190234       259           1.2;DESC;AVAIL        desc
============================================================

id   file_id   file_version_id      val                type
162   190234       259             1.2                version

id   file_id   file_version_id      val                type
162   190234       259             DESC                name

 id   file_id   file_version_id     val                 type
162   190234       259              AVAIL           availability
从示例中可以看到,我必须插入
3条记录,其中包含来自父行的数据。数据顺序为
版本、名称和可用性
,如果某些记录
名称
不可用,即
3.4;不可用
则只需插入类型为
Version
availability
的两条记录。您可以使用
UNNEST()
拆分列
val
,并使用大小写表达式更新列
type

INSERT INTO tablename (id, file_id, file_version_id, val, type)
WITH cte AS (
  SELECT *, UNNEST(STRING_TO_ARRAY(val, ';')) str
  FROM tablename                              
)
SELECT id, file_id, file_version_id, str,
  CASE
    WHEN str ~ '^[0-9\.]+$' THEN 'version'
    WHEN str IN ('AVAIL', 'NOT AVAIL') THEN 'availability'
    ELSE 'name'                   
  END
FROM cte;
请参阅简化的。

大概是字符串中值的位置决定了
类型,而不是它们的值。我建议
unnest()
使用位置和
大小写
表达式:

insert into file (id, file_id, file_version_id, val, type)
    select f.id, f.file_id, f.file_version_id, u.val,
           (case u.n 
                when 1 then 'version'
                when 2 then 'name'
                when 3 then 'availability'
            end)
    from file f cross join lateral
         unnest(string_to_array(f.val, ';')) with ordinality u(val, n);
如果要确保所有值都存在,可能需要
where f.val类似“;%”;%


是一个dbfiddle。

插入到同一个表中?@forpas是的,在文件表中只有两个值,如:xxx;yyy或1值zzz,您如何知道哪个是哪个?如果它们是版本、名称或可用性?@forpas正如我提到的顺序是相同的
version、name和availability
如果有两个连续的字符串,即
name和availability
如果前一个数字是另一个字符串,即version和name。您真正使用的是哪个数据库?PL/SQL标签建议使用Oracle,但是-有MySQL和PostgreSQL,所以…?错误是什么?
unnest()
正常:。运行此sql