postgresql 从varchar列中提取字母数字值

n3h0vuf2  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(197)

我有一个表,其中包含一个列,该列具有存储为字符串的字母数字值。我在该列中有多个值,例如F473700Y778PP0098XXYYYZ等。
我想提取以一系列F开头的值,并且该行必须具有数值。字母数字列是具有唯一值的唯一列,但表中其余列包含重复值。
此外,一旦提取了这些值,我想从重复行中提取
max value
,例如:

  • 假设我有F4737F4700作为唯一的字母数字行,那么必须从中提取F4737

我写了一个这样的查询,但数值并没有从这个查询中提取出来:

select max(Alplanumeric) 
from Customers 
where Alplanumeric '%[F0-9]%

字符串
或者是

select max(Alplanumeric) 
from Customers 
where Alplanumeric like '%[0-9]%' 
and Alplanumeric like 'F%'**


我运行了上面的查询,但如果我从上面的查询中删除数字部分,我只会得到F系列。如何提取F起始序列以及该行中包含的数值?

z31licg0

z31licg01#

在一个肢体上,你可能会寻找这样的查询:

SELECT *, substring(alphanumeric, '^F(\d+)')::int AS nr
FROM   customers 
WHERE  alphanumeric ~ '^F\d+' 
ORDER  BY nr DESC NULLS LAST
        , alphanumeric
LIMIT  1;

字符串
WHERE条件是一个正则表达式匹配,表达式被锚定到开始,所以它可以使用索引。理想情况下:

CREATE INDEX customers_alphanumeric_pattern_ops_idx ON customers
(alphanumeric text_pattern_ops);


这将返回以'F'开头并后跟一位或多位数字的行中alphanumeric中具有最高(提取)数值的一行。
关于索引:

  • PostgreSQL LIKE查询性能变化

关于模式匹配:

理想情况下,您应该将前导文本和后续数值存储在 * 单独的 * 列中,以使其更有效。你不一定需要更多的表一样已经建议。

相关问题