从varchar列

时间:2015-08-09 15:33:23

标签: sql postgresql greatest-n-per-group sql-like alphanumeric

我有一个包含字母数字值的列的表格,该列存储为字符串。我在该列中有多个值,其值包括F473700Y778PP0098XXYYYZ等。

我想从一系列F开始提取值,并且该行必须包含数值。 字母数字列是具有唯一值的唯一列,但其余列在我的表中包含重复值。

此外,一旦提取了这些值,我想从重复行中选取最大值,例如:

假设我将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起始系列以及该行中包含的数值?

1 个答案:

答案 0 :(得分:0)

走出困境,你可能正在寻找这样的查询:

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);

这将返回alphanumeric中以{F'开头,后跟一个或多个数字的行中具有最高(提取)数值的一行。

关于索引:

关于模式匹配:

理想情况下,您应将前导文本和以下数值存储在 单独 列中,以提高效率。您不一定需要更多像已建议的表格。