带空格的PostgreSQL子字符串模式

带空格的PostgreSQL子字符串模式,sql,regex,postgresql,substring,Sql,Regex,Postgresql,Substring,我一直在努力解决这个问题,尝试在这个论坛上找到的解决方案,但我不能继续。我需要帮助。 我有一个专栏,在船的一生中存储船名,我想把它们分成三列。 主要有这三种选择, a) 只有一个名字 select t2.esp1,t2.espectro,t2.espectro1, t2.id from( select substring(t.espectro, t.posfin)::varchar as esp1, t.espectro,t.espectro1,t.id from( select "Id" as

我一直在努力解决这个问题,尝试在这个论坛上找到的解决方案,但我不能继续。我需要帮助。 我有一个专栏,在船的一生中存储船名,我想把它们分成三列。 主要有这三种选择,

a) 只有一个名字

select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp1, t.espectro,t.espectro1,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname1 as espectro1 from ships) t)t2 (esp1, espectro, espectro1, id)
where t2.esp1 not like '% y %'`)
b) 两个名字

select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro,1, t.posfin)::varchar as esp1, t.espectro,t.espectro1,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname ' y ') as posfin,shipname as espectro, shipname1 as espectro1 from ships) t)t2 (esp1, espectro, espectro1, id)
where t2.esp1 not like '%, %'`) and for the second name (`select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp2, t.espectro,t.espectro2,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname2 as espectro2 from ships) t)t2 (esp2, espectro, espectro2, id)
where t2.esp2 like '% y %' and t2.espectro not like '%, %';
c)三个名字:我可以得到第一个

select substring(t.espectro,1,t.posicion) from(
select strpos(shipname, ',') as posicion,shipname as espectro from ships) t;` and third `select t2.esp3,t2.espectro,t2.espectro3, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp3, t.espectro,t.espectro3,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname3 as espectro3 from ships) t)t2 (esp3, espectro, espectro3, id)
where t2.esp3 like '% y %' and t2.espectro like '%, %';
但不是第二个

三条命名记录如下所示:

Nuestra Señora del Rosario, Santo Domingo y San José
我尝试过这个选项:

select substring(t.shipsnames from '%#",_y#"%' for '#') as name2 from ships t
select t2.name2[6:7] from (regexp_split_to_array(t.shipnames, E'\\s+') as name2 from ships t) t2
在#“pattern#”中做了一些更改,以查找空白并获得第二个名称。 然后我尝试了这个选项:

select substring(t.shipsnames from '%#",_y#"%' for '#') as name2 from ships t
select t2.name2[6:7] from (regexp_split_to_array(t.shipnames, E'\\s+') as name2 from ships t) t2
但它不起作用,因为不是每个记录都有相同的长度,所以有些像{“Santo”,“Domingo”}一样被解决,而另一些像{“Rosario”,“,”}一样被解决。
我不熟悉regex sintax,我在PostgreSQL文档中找到了这个示例。有什么提示吗?

当名称被逗号加上可选空格或y被强制空格包围时,应拆分名称。以下正则表达式将起作用:

\s*,\s*|\s+y\s+
\s
:空格字符,
+
:至少一个,
*
:零个或多个,
|
表示替换

使用此正则表达式的SQL示例:

SELECT Id, ShipNamesArray[1] ShipName1, ShipNamesArray[2] ShipName2, ShipNamesArray[3] ShipName3
FROM (
    SELECT Id, regexp_split_to_array(Shipnames, '\s*,\s*|\s+y\s+') ShipNamesArray
    FROM (VALUES
        (1, 'Nuestra Señora del Rosario, Santo Domingo y San José'),
        (2, 'Nuestra Señora del Rosario y Santo Domingo'),
        (3, 'Nuestra Señora del Rosario')
    ) AS ExampleShipNames (Id, ShipNames)
) AS SplitShipNames
SQL将生成以下输出:

Id | ShipName1                  | ShipName2     | ShipName3
-- | -------------------------- | ------------- | ---------
 1 | Nuestra Señora del Rosario | Santo Domingo | San José
 2 | Nuestra Señora del Rosario | Santo Domingo |
 3 | Nuestra Señora del Rosario |               |

如果您需要同时使用空格和逗号进行拆分,请尝试
E'[\\s,]+'
。您到底想要实现什么?当
Nuestra Señora del Rosario,Santo Domingo y San Jose
作为输入提供时,是否希望
Nuestra Señora del Rosario
Santo Domingo
San Jose
作为输出?如果是,一行三列还是三行一列?您能提供a)和b)的解决方案作为示例吗?@markus benko我添加了代码以对我使用的记录进行子串。它工作得很好。谢谢你的反馈,我想得到三个名字,分别放在三个不同的栏中,因为这是这艘船一生中得到的三个名字。那么,三列name1,name2,name3并将每个名称存储在那里。嗨!谢谢你的反馈。我尝试过你的解决方案,但至少对我来说失败了。它不会在
\s+y\s+
之间分割名称,并删除
s
字符。我已将代码改进为此
,\s*\s*y\s*”
。但现在我有了一个新问题。有一些名字,如努埃斯特拉·塞尼奥拉·德洛斯雷耶斯(Nuestra señora de los Reyes)或圣卡耶塔诺(San Cayetano),这些名字被拆分为,因为代码并不完美。我尝试了几种选项,如
\、\s+\s*y\s+
和其他组合。但如果没有其他解决方案,它仍然不起作用,您的解决方案非常好,只需要一点清洁工作,所以提前感谢!当您按原样从答案1:1执行SQL时,您没有得到预期的输出吗?你得到了什么?正则表达式不会删除的字符。也许复制和粘贴有问题,或者有误解?
Id | ShipName1 | Shipname2 | Shipname31 | Nuestra Señora del Rosario | Santo Domingo y San José|“2 | Nuestra Se nora del Rosario y Santo Domingo |”“3 | Nuestra Se ora del Rosario |”“这是我得到的回应。我在这个服务器上使用Postgres 8.3,这可能是一个问题吗?好的,它按照我的预期工作,但不幸的是,我当时一定完全误解了你的问题。你能更详细地解释什么是输入,什么是你想要得到的输出吗?也许可以通过展示一个完整的例子。嗨!我不认为你误解了这个问题,你的预期产出正是我所需要的。问题是西班牙语名字中有很多奇怪的字符,这很棘手。输入就是我解释的,一个文本字段,其中的名称大多数情况下只有一个名称,然后两个名称用
'y'
分隔,最后三个名称用
和一个
'y'
分隔。我想把这个字段分成三个独立的字段,每个名称对应一个字段。正如您所提议的,它是有效的,但是在西班牙语中,
y
是很棘手的,比如
Reyes、Cayetano、Rey等等。
谢谢您的反馈。