根据多个分隔符拆分记录

时间:2019-03-18 06:40:01

标签: sql postgresql split

我正在尝试在PostgreSQL中准备查询。

下面是我的输入内容:

enter image description here

在这里,您会发现字段列中的值唯一,而 Values 列中的值带有多个分隔符。

现在我想要下面的输出。

enter image description here

以下是步骤:

  1. 第一个值应该用“;” 分隔,并使用 SplitFields
  2. 生成新列
  3. Spitalfields 中,我们必须再次使用“ >>” 将其分开,并且第一个值应被视为 Folder ,第二个值应被视为应该被视为

如何准备查询?

我已经在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

1 个答案:

答案 0 :(得分:6)

这在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;

或者如果您需要保留“拆分”的第一级:

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;

在线示例:https://rextester.com/IOW62752