Che*_*ani 1 sql postgresql split
我正在尝试在PostgreSQL中准备查询。
以下是我的输入:
在这里,您可以发现“ 字段”列中的值是唯一的,“ 值”列中的值带有多个分隔符。
现在我想要下面的输出。
步骤如下:
如何准备查询?
我已经在SQL Server中准备了相同的查询,但是在PostgreSQL中,它对我不起作用,因为我不了解PostgreSQL。
这是对SQL Server的查询:
DECLARE @String varchar(1000)
SELECT
@String = 'AV»ABC1; AC»ACTag; BB»BB1Tag; SampleInner»STag1; Not Privileged (RS)»Priv1tag; Winter 2015 Review»Windter1Tag'
SELECT
*,
LEFT(VALUE, CHARINDEX('»', VALUE) - 1) AS firstname,
SUBSTRING(VALUE, CHARINDEX('»', VALUE) + 1, LEN(VALUE) - (CHARINDEX('»', VALUE) - 1)) AS lastname
FROM (SELECT
SUBSTRING(';' + @String + ';', Number + 1,
CHARINDEX(';', ';' + @String + ';', Number + 1) - Number - 1) AS VALUE
FROM master..spt_values
WHERE Type = 'P'
AND Number <= LEN(';' + @String + ';') - 1
AND SUBSTRING(';' + @String + ';', Number, 1) = ';') AS A
Run Code Online (Sandbox Code Playgroud)
在Postgres中这更容易。您首先需要通过分割字符串;
来创建行,然后使用string_to_array()
分割第二层
select field,
elements[1] as folder,
elements[2] as value
from (
select t.field, "values", string_to_array(x.elements, '»') as elements
from the_table t
cross join unnest(string_to_array(t."values", ';')) as x(elements)
) x;
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要保留“拆分”的第一级:
select field,
splitfields,
split_part(splitfields, '»', 1) as folder,
split_part(splitfields, '»', 2) as value
from (
select t.field, "values", x.splitfields
from the_table t
cross join unnest(string_to_array(t."values", ';')) as x(splitfields)
) x;
Run Code Online (Sandbox Code Playgroud)
在线示例:https://rextester.com/IOW62752