根据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