我有一个列nr
,其中包含格式为12345-12345
的字符串。短划线前后的数字可以是任意长度。我想获得nr
的最大值,只考虑破折号之后的部分。我试过了
SELECT MAX(nr) AS max_nr FROM table WHERE (nr LIKE '12345-%')
然而,这仅适用于值< 10(即12345-9将作为最大值返回,即使存在12345-10)。我想删除破折号并进行类型转换:
SELECT MAX(REPLACE(nr, '-', '')::int) AS max_nr FROM table WHERE (nr LIKE '12345-%')
然而,这当然会返回没有破折号的结果。在结果中包含短划线和破折号前面的数字时获得最大值的最佳方法是什么?
PostgreSQL 9.1
答案 0 :(得分:2)
我不是PostGres的专家,但您可以使用regexp_replace('foobarbaz', 'b..', 'X')
在短划线后提取字符串,然后将数字转换为int。以下查询将仅从您的表中检索nr的一行,其中nr类似于12345-%,按照降序后的数字按降序排序(最大数字首先)。
SELECT nr
FROM table WHERE (nr LIKE '12345-%')
ORDER BY regexp_replace(nr, '^\d+-', '')::integer DESC
LIMIT 1
上面的正则表达式删除了前导数字和短划线,只留下最后一组数字。例如,54352-12345将变为12345。
这是SQL Fiddle说明它的用法。
答案 1 :(得分:2)
将子串函数与位置函数一起使用: http://www.postgresql.org/docs/8.1/static/functions-string.html 在破折号后提取数字,然后在MAX函数中使用此值,就像现在在代码中一样。您也可以尝试编号函数。
它看起来与此类似:
MAX(substring(nr from position('-' in nr))::int)