我有一个person
表,其中name
列包含名称,有些格式为"最后一个"和一些格式"第一"。
我的查询
SELECT name,
SUBSTRING(name FROM 1 FOR POSITION(' ' IN name) ) AS first_name
FROM person
创建一个新的名字行,但它不适用于只有名字且根本没有空格的名称。
我知道我需要一个类似CASE
之类的0 = (' ', name)
语句,但我一直遇到语法错误,并会很感激。
答案 0 :(得分:3)
只需使用split_part()
:
SELECT split_part(name, ' ', 1) AS first_name
, split_part(name, ' ', 2) AS last_name
FROM person;
相关:
答案 1 :(得分:0)
1
select
substring(name from '^([\w\-]+)') first_name,
substring(name from '\s(\w+)$') last_name
from person
2
select (regexp_split_to_array(name, ' '))[1] first_name
, (regexp_split_to_array(name, ' '))[2] last_name
from person
答案 2 :(得分:0)
Erwin和Danstopka都以自己的风格获得了最佳答案。我使用他们的方法扩展到我的用例,我们只在中间名存在的情况下才需要中间名。
-示例
WITH tablename( name ) AS
(
SELECT 'Barn KE Roman'
UNION ALL
SELECT 'Utry Rita'
UNION ALL
SELECT 'Jam Ilya Dimo'
)
SELECT (Regexp_split_to_array(NAME, ' '))[1] first_name , (
CASE
WHEN array_length(regexp_split_to_array(NAME, ' '),1) > 2 THEN (regexp_split_to_array(NAME, ' '))[2]
END ) middle_name , (
CASE
WHEN array_length(regexp_split_to_array(NAME, ' '),1) > 2 THEN (regexp_split_to_array(NAME, ' '))[3]
ELSE (regexp_split_to_array(NAME, ' '))[2]
END ) last_name
FROM tablename
没什么特别的,我取每个数组的长度,检查数组是否超过3个单词,然后相应地确定中间名和姓氏。