Sql Postgres:选择列值的最大整数子字符串

Sql Postgres:选择列值的最大整数子字符串,sql,regex,string,postgresql,substring,Sql,Regex,String,Postgresql,Substring,我使用的是postgresql,但在制定正确的sql查询时遇到了问题。这个问题的标题可能听起来很奇怪,但这正是我想要实现的。我目前正在对一个特定的表执行数据整理。如果我有一个表产品包含: id | designation --------------------- 1 | IR15A1021 2 | IR15A1001 3 | IR15A1050 4 | AB100 5 | AR100 我想做的是: 1) 仅获取的整数子串和精确地那些名称为且模式以“IR15A”开头的记录。和整数子

我使用的是postgresql,但在制定正确的sql查询时遇到了问题。这个问题的标题可能听起来很奇怪,但这正是我想要实现的。我目前正在对一个特定的表执行数据整理。如果我有一个表产品包含:

id | designation
---------------------
1  | IR15A1021
2  | IR15A1001
3  | IR15A1050
4  | AB100 
5  | AR100
我想做的是:

1) 仅获取的整数子串精确地那些名称为且模式以“IR15A”开头的记录。和整数子字符串,表示起始字符串“IR15A”后的数字。(102110011050)

2) 获取最大整数子字符串,因此在这种情况下:

maximum integer substring : 1050 
因为所有其他IR15A的最大子字符串都小于它(1021和1001)

假设条件正确。

1) IR15A之后的子字符串始终是整数,因此不必担心类型,它将始终是整数。 2) 忽略其他指定模式。只有IR15A

我只成功地获得了“%IR15A%”通配符搜索,但还没有找到任何解决方案来从中删除整数子字符串,并将其与其他字符串进行比较以获得最大值。谢谢

试试这个:

select max(cast(substring(designation from '....$') as int))
from tab
where designation like 'IR15A%'
  • 仅使用
    如“IR15A%”等
    获取具有
    IR15A
    的行
  • 使用
    子字符串(名称来自“......$”)
    删除
    IR15A
  • 使用
    cast
  • 使用
    max()获取
    max

  • 演示

    哇!刚刚测试了一下,效果很好。接下来,你是如何在大脑中安装postgres的?xD我将在几分钟内接受这个答案。非常感谢。@muffin我很高兴能帮上忙:)请注意,只有当模式在
    IR15A
    之后有4位数字时,这才有效,在这种情况下,您应该使用
    right(名称,4)
    而不是
    子字符串,因为您的模式匹配是不必要的。否则,使用正则表达式模式匹配贪婪限定符+1无论如何,因为您实际上解释了您的答案,但没有解释其局限性。示例:。
    regexp\u matches
    返回一个数组,这让它变得有点尴尬。@CraigRinger感谢您的评论!你是对的,我的解决方案不是万能的,是为这种情况准备的。OP表示,
    2)忽略其他指定模式。只有IR15A。
    IR15A后面是否总是有4位数字?或者可能会有所不同?