我有一个列nr,它包含12345-12345格式的字符串。短跑前后的数字可以是任意长度的。我想得到nr的最大值,只考虑到破折号后的部分。我试过了
SELECT MAX(nr) AS max_nr FROM table WHERE (nr LIKE '12345-%')
但是,这只适用于< 10的值(即,即使存在12345-10,也将以最大值形式返回12345-9 )。我想移除破折号并进行类型转换:
SELECT MAX(REPLACE(nr, '-', '')::int) AS max_nr FROM table WHERE (nr LIKE '12345-%')
然而,这当然返回没有破折号的结果。在结果中包含破折号和破折号之前的数字时,获得最大值的最佳方法是什么?
PostgreSQL 9.1
发布于 2014-12-18 17:38:22
我不是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。
发布于 2014-12-18 17:38:49
使用带有位置函数的子字符串函数:http://www.postgresql.org/docs/8.1/static/functions-string.html在破折号后提取数字,然后在MAX函数中使用这个值,就像现在在代码中使用的那样。您也可以尝试使用to_number函数。
它看起来类似于这样:
MAX(substring(nr from position('-' in nr))::int)https://stackoverflow.com/questions/27552399
复制相似问题