简体   繁体   English

根据多个分隔符拆分记录

[英]Split records based on multiple separator

I am trying to prepare a query in PostgreSQL. 我正在尝试在PostgreSQL中准备查询。

Below is my input: 以下是我的输入:

在此处输入图片说明

Here you can find that in Field column has a unique value and Values column has values with multiple separators. 在这里,您可以发现“ 字段”列中的值是唯一的,“ 值”列中的值带有多个分隔符。

Now I want below output. 现在我想要下面的输出。

在此处输入图片说明

Here are the steps: 步骤如下:

  1. First value should be separated with ";" 第一个值应以“;”分隔 and generate new column with SplitFields 并使用SplitFields生成新列
  2. From Spitalfields we have to again separate it with ">>" and in that first value should be considered as Folder and Second Value should be considered as Value Spitalfields中,我们必须再次用“ >>”将其分开,并且第一个值应被视为Folder ,第二个值应被视为Value

How can I prepare the query? 如何准备查询?

I have prepared the same query in SQL server but in PostgreSQL, it didn't work for me as I have no idea about PostgreSQL. 我已经在SQL Server中准备了相同的查询,但是在PostgreSQL中,它对我不起作用,因为我不了解PostgreSQL。

Here is the query for SQL Server: 这是对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

This is way easier in Postgres. 在Postgres中这更容易。 You first need to split the string by ; 您首先需要将字符串除以; to create the rows, then use string_to_array() to split up the second level 创建行,然后使用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;

Or if you need to preserve the first level of "splitting": 或者,如果您需要保留“拆分”的第一级:

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;

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM