如何获取 postgres select 中数字第一次出现的位置

Cra*_*ver 4 regex sql postgresql parsing

我有一个包含 SDK 名称和版本的字段,但它没有标准化,因此我可以轻松提取名称和版本。这些是人为的值,但代表了我正在使用的可能值:

  • JavaScript/2.3.4
  • JavaScript/4.3.1
  • 安卓4.6.5
  • 安卓3.2.1
  • 斯威夫特4.5.3
  • 斯威夫特/3.1.1.5

正如您所看到的,“/”的使用不一致,我需要一种方法来一致地解析数字中的字母,以便我最终得到如下两列:

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 查询。

kli*_*lin 6

使用正则表达式函数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)