【问题标题】:Postgres : Select the maximum integer substring of a column valuePostgres:选择列值的最大整数子字符串
【发布时间】:2015-07-26 06:32:30
【问题描述】:

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

id | designation
---------------------
1  | IR15A1021
2  | IR15A1001
3  | IR15A1050
4  | AB100 
5  | AR100

我想做的是:

1) 获取only 的整数子字符串,并恰好 获取指定其模式以'IR15A' 开头的那些记录。并且通过整数子字符串,表示起始字符串'IR15A'之后的数字。 (1021,1001,1050)

2) 获取最大整数子串所以在这种情况下:

maximum integer substring : 1050 

因为所有其他 IR15A 的最大子字符串都小于它(1021 和 1001)。

假设条件正确。

1) IR15A 之后的子字符串总是整数,所以不用担心类型,它总是整数。 2) 忽略其他指定模式。只是 IR15A。

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

【问题讨论】:

  • IR15A后面总是有4位数字吗?还是会有所不同?

标签: sql regex string postgresql substring


【解决方案1】:

试试这个:

select max(cast(substring(designation from '....$') as int))
from tab
where designation like 'IR15A%'
  1. 使用like 'IR15A%' 仅获取带有IR15A 的行
  2. 使用substring(designation from '....$') 删除IR15A
  3. 使用 cast 将其转换为 int
  4. 使用max() 获取max

Sql Fiddle演示

【讨论】:

  • 哇!刚刚测试了这个,它就像一个魅力。跟进,你是如何设法在你的大脑中安装 postgres 的? xD 我会在几分钟内接受这个答案。非常感谢。
  • @muffin 很高兴能帮上忙 :)
  • 请注意,这仅适用于模式在 IR15A 之后有 4 位数字的情况,在这种情况下,您应该使用 right(designation, 4) 而不是 substring,因为您的模式匹配是不必要的。否则,使用带有贪婪限定符的正则表达式模式匹配。无论如何+1,因为您实际上解释了您的答案,尽管不是它的局限性。
  • 示例:sqlfiddle.com/#!15/0b19e/12regexp_matches 返回一个数组,这让事情变得有点尴尬。
  • @CraigRinger 感谢您的评论!你是对的,我的解决方案不是通用的,是为这种情况准备的。 OP 说2) Ignore other designation patterns. just the IR15A.
猜你喜欢
  • 2013-05-06
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2022-12-15
相关资源
最近更新 更多