我知道bigquery中没有数据类型。在bigquery中,您更喜欢处理什么语义版本?
我有以下模式:
software:string,
software_version:string
软件版本列为 string
但我存储的数据是semver格式的:major.minor.patch-prerelease 我特别想表演操作员
<>
=` .
select '4.0.0' < '4.0.0-beta'
这是回报 true
但根据塞姆弗的定义,这是假的。因为这个角色 -
用于预发布。
2条答案
按热度按时间ttisahbt1#
下面是bigquery标准sql
你可以用
compareSemanticVersion
比较两个语义版本的自定义项和/或使用
normaizedSemanticVersion
自定义项通过ORDERBY子句对输出进行排序。请参阅下面的示例,其中包含两个(比较和排序方式)用例
有输出
注意:在阅读了您提供的参考资料之后,我基于对语义版本控制的理解编写了上述UDF。有一些潜在的边缘情况仍然需要解决。但绝对应该适用于简单的情况,我希望您能够简单地采用这些自定义项,并根据您的特殊需要调整输出,甚至可以优化我在这里使用的结果
另一个仅供参考:在
normaizedSemanticVersion
我正在使用的自定义项zzzzzzzzzz
只是为了解决一些边缘案件。我试过的另一个选择是..zzzzzzzzzz
(注意两个额外的点)-我认为这对于更复杂的情况给出了更好的结果-但是我真的没有时间完成测试。请试一试例如,在语义版本控制页面中有一个示例:1.0.0-alpha<1.0.0-alpha.1<1.0.0-alpha.beta<1.0.0-beta.2<1.0.0-beta.11<1.0.0-rc.1<1.0.0。
按照这个例子的顺序-
..zzzzzzzzzz
应使用-见下文与语义版本规范匹配的输出
qgzx9mmu2#
这不是bigquery的问题。声明
'4.0.0' < '4.0.0-beta'
会回来的True
在所有编程语言中,这种比较是基于字母顺序的,而字母顺序与语义版本顺序不同。我建议编写一些自定义udf函数来解决您的问题,或者尝试使用如下sql:
当然,在比较版本时也要小心,因为在这种情况下,比较不会像您期望的那样工作
然后你必须将版本分为“主要”、“次要”、“补丁”,并分别按每个元素进行比较。