我有一个包含表示版本"版本"的字符串的列,如下所示:

5.14.0
5.10.1
5.1.8
5.1.87
5.1.357
26.3.0
24.1.1

我怎么才能在snowflake里把这些分类呢?请注意,数字排序(我们需要的)不同于简单的字符串排序.

推荐答案

我们在DBT Slack上讨论了这一点-我的建议是通过拆分字符串并将其转换为整数数组来将排序转换移动到order by.Snowflake本身知道如何按正确的顺序对这些数组进行排序:

select *
from data
order by (
    select [y[0]::int, y[1]::int, y[2]::int]
    from(
        select split(version_number, '.') y
    )
);

样本数据:

create table data as 
select value version_number
from (table(split_to_table(
$$5.14.0
5.10.1
5.1.8
5.1.87
5.1.357
26.3.0
24.1.1$$, '\n'
    )))
;

我们还可以为可重用性创建UDF:

create function string_to_int_array_3(version_number string)
returns array
as
$$
    select [y[0]::int, y[1]::int, y[2]::int] 
    from(
        select split(version_number, '.') y
    )
$$
;

select *
from data
order by string_to_int_array_3(version_number);

enter image description here

Sql相关问答推荐

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

为什么在这种情况下我不能使用LAG函数?

如何根据特定的内部json元素值过滤postgres查询结果?

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

如何在postgres函数中插入后返回布尔值?

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

仅在日期相隔时递增(Oracle SQL)

优化Postgres搜索未知长度的子串

Postgres jsonpath运算符的变量替换,如_regex?

同时插入和更新记录

group-by-clause具有特定列,而不是oracle的toad中的all

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

除了风格之外,还有什么理由更喜欢简单的CASE WHEN而不是搜索呢?

在没有订单的情况下,如何生成一个值为0的顾客天数行

如何将输出转换为二维格式?

使用其他表 SUM 的交换价格转换价格并获得 AVG

如何将 CONCATENATED 值与临时表中的值匹配

添加一列并根据其他列值进行填充

从每行中排除最大元素