Postgres 9.4+将字母数字字符串拆分为两列

时间:2016-07-05 21:24:00

标签: string postgresql substring postgresql-9.4

我需要处理以下问题,搜索后我无法找到我正在寻找的内容:

我们说我有一个列可能有也可能没有字母数字字符串

SKU
-----
12345ABC
12345-Abc
12345-Ab23
12345

我想闯入

SKU   | BATCH
------------------
12345 | ABC
12345 | Abc
12345 | Ab23
12345 | NULL

使用PostgreSQL 9.4+我已经尝试了stringsub_string方法,但我没有得到我希望实现的结果。任何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用substring function

with a (SKU) as (values('12345ABC'), ('12345-Abc'), ('12345-Ab23'), ('12345'))
select substring(sku from '^\d+'), substring(sku from '[a-zA-Z][a-zA-Z0-9]*$') from a;

 substring | substring 
-----------+-----------
 12345     | ABC
 12345     | Abc
 12345     | Ab23
 12345     | 
(4 rows)

答案 1 :(得分:0)

您可以使用regexp_matches:

with a (SKU) as (values('12345ABC'), ('12345-Abc'), ('12345-Ab23'), ('12345'))
select res[1], res[2]
from (
    SELECT regexp_matches(SKU, '(\d+)[^[:alnum:]]*([[:alnum:]]+)?')     res 
    FROM a
) y;