【问题标题】:Version number(x.y.z) comparison in SQL query by using regular expressionSQL查询中使用正则表达式比较版本号(x.y.z)
【发布时间】:2022-01-23 08:19:17
【问题描述】:

我有一个如下所示的 SQL 数据库表。

id version data
1 1.0.1 xxx
2 1.1.0 yyy
3 1.1.3 zzz
4 1.10.1 aaa
5 2.0.0 bbb

我想选择version大于等于1.1.0的数据。

在上述情况下,预期的输出如下。

id version data
2 1.1.0 yyy
3 1.1.3 zzz
4 1.10.1 aaa
5 2.0.0 bbb

你能告诉我如何在 SQL 查询中提取它吗??

【问题讨论】:

  • 假设你在谈论 MySQL,this StackOverflow link 有一个接受的答案。
  • MSSQL 2016 及更高版本有STRING_SPLIT
  • 您使用的是哪种 DBMS 产品? “SQL”只是所有关系数据库都使用的一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 如果你使用的是Postgres,你可以使用WHERE string_to_array(version, '.')::int[] >= array[1,1,0]

标签: sql regex


【解决方案1】:

如果您的“版本字符串”有不错的固定长度字段(例如“01.10.02”),那么这很容易。

既然你没有,MSSQL 2016 及更高版本提供STRING_SPLIT

或者,这是一个很好的解决方案,您应该能够与大多数 RDBM(包括 Oracle、MSSLQ 和 mySql)一起使用:

https://stackoverflow.com/a/33560117/421195

SQL> WITH DATA AS
  2    ( SELECT 'F/P/O' str FROM dual
  3    )
  4  SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1,
  5         SUBSTR(str, Instr(str, '/', -1, 1) +1) part2
  6  FROM DATA
  7  /

PART1 PART2
----- -----
F/P   O

该示例将字符串分成单独的列(例如主要/中间/次要数字)。

从那里,您需要比较不同行中的相应列。

可以想象,您可以在一个 SQL“选择”中完成所有操作。在实践中,编写一个存储过程一次只做一件可能会更容易。

我希望这可以帮助您指出正确的方向...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2017-05-13
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多