我有一个包含字母数字值的列的表格,该列存储为字符串。我在该列中有多个值,其值包括F4737
,00Y778
,PP0098
,XXYYYZ
等。
我想从一系列F开始提取值,并且该行必须包含数值。 字母数字列是具有唯一值的唯一列,但其余列在我的表中包含重复值。
此外,一旦提取了这些值,我想从重复行中选取最大值,例如:
假设我将F4737
和F4700
作为唯一的字母数字行,则必须从中提取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起始系列以及该行中包含的数值?
答案 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'开头,后跟一个或多个数字的行中具有最高(提取)数值的一行。
关于索引:
关于模式匹配:
理想情况下,您应将前导文本和以下数值存储在 单独 列中,以提高效率。您不一定需要更多像已建议的表格。