Cra*_*ver 4 regex sql postgresql parsing
我有一个包含 SDK 名称和版本的字段,但它没有标准化,因此我可以轻松提取名称和版本。这些是人为的值,但代表了我正在使用的可能值:
正如您所看到的,“/”的使用不一致,我需要一种方法来一致地解析数字中的字母,以便我最终得到如下两列:
JavaScript 2.3.4
JavaScript 4.3.1
Android 4.6.5
Android 3.2.1
Swift 4.5.3
Swift 3.1.1.5
Run Code Online (Sandbox Code Playgroud)
我已经寻找了不同的方法来做到这一点,但我发现似乎没有任何方法可以满足我的要求。
最终,我需要将其放入 Postgres SELECT 语句中,如下所示:
我认为 DISTINCT 关键字是不必要的并且令人困惑。它最初是 COUNT/GROUP BY 查询的一部分,但为了简单起见,我只想分别列出具有三列的所有行:sdk、sdk_name 和 sdk_version。从那里我将使用答案中的最佳解析公式来按照我的要求进行操作。
SELECT sdk, [parse sdk name formula] as "sdk_name", [parse sdk version formula] as "sdk_version"
Run Code Online (Sandbox Code Playgroud)
此外,我没有在查询中提供固定的 SDK 列表,因此我不确定该with/as/values策略是否适合我,但我不知道并且看起来很有用。不过,我认为 with/values 可以只是另一个 SELECT 查询。
使用正则表达式函数substring():
with my_data(sdk) as (
values
('JavaScript/2.3.4'),
('JavaScript/4.3.1'),
('Android4.6.5'),
('Android3.2.1'),
('Swift4.5.3'),
('Swift/3.1.1.5')
)
select
substring(sdk from '[^\d/]*') as sdk_name,
substring(sdk from '\d.*') as sdk_version
from my_data
sdk_name | sdk_version
------------+-------------
JavaScript | 2.3.4
JavaScript | 4.3.1
Android | 4.6.5
Android | 3.2.1
Swift | 4.5.3
Swift | 3.1.1.5
(6 rows)
Run Code Online (Sandbox Code Playgroud)
更新。
您可以将查询放在部分(而不是)select中:withvalues
with my_data(sdk) as (
<select sdk from ...>
)
select
substring(sdk from '[^\d/]*') as sdk_name,
substring(sdk from '\d.*') as sdk_version
from my_data
Run Code Online (Sandbox Code Playgroud)
或在from条款中:
select
substring(sdk from '[^\d/]*') as sdk_name,
substring(sdk from '\d.*') as sdk_version
from (
<select sdk from ...>
) my_data
Run Code Online (Sandbox Code Playgroud)