从单列中分离名字和姓氏
Seperate first and last names from single column
我有一个 person
table,其中 name
列包含名称,一些格式为 "first last",一些格式为 "first"。
我的查询
SELECT name,
SUBSTRING(name FROM 1 FOR POSITION(' ' IN name) ) AS first_name
FROM person
创建新的名字行,但它不适用于只有名字且根本没有空白 space 的名字。
我知道我需要一个 CASE
语句,其中包含 0 = (' ', name)
之类的内容,但我将 运行 保留为语法错误,希望得到一些指示。
只需使用split_part()
:
SELECT split_part(name, ' ', 1) AS first_name
, split_part(name, ' ', 2) AS last_name
FROM person;
相关:
- Split comma separated column data into additional columns
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
欧文和丹斯托普卡都有各自风格的最佳答案。我已经使用他们的方法扩展到我的用例,在该用例中我们只需要中间名(如果存在)。
--例子
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 个单词,然后相应地决定中间名和姓氏。
我有一个 person
table,其中 name
列包含名称,一些格式为 "first last",一些格式为 "first"。
我的查询
SELECT name,
SUBSTRING(name FROM 1 FOR POSITION(' ' IN name) ) AS first_name
FROM person
创建新的名字行,但它不适用于只有名字且根本没有空白 space 的名字。
我知道我需要一个 CASE
语句,其中包含 0 = (' ', name)
之类的内容,但我将 运行 保留为语法错误,希望得到一些指示。
只需使用split_part()
:
SELECT split_part(name, ' ', 1) AS first_name
, split_part(name, ' ', 2) AS last_name
FROM person;
相关:
- Split comma separated column data into additional columns
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
欧文和丹斯托普卡都有各自风格的最佳答案。我已经使用他们的方法扩展到我的用例,在该用例中我们只需要中间名(如果存在)。
--例子
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 个单词,然后相应地决定中间名和姓氏。