Sql 从varchar列中提取字母数字值
我有一个表,其中包含一个列,该列具有字母数字值,该值存储为字符串。我在该列中有多个值,这些值包括Sql 从varchar列中提取字母数字值,sql,postgresql,greatest-n-per-group,sql-like,alphanumeric,Sql,Postgresql,Greatest N Per Group,Sql Like,Alphanumeric,我有一个表,其中包含一个列,该列具有字母数字值,该值存储为字符串。我在该列中有多个值,这些值包括F4737,00Y778,PP0098,XXYYYYZ等 我想提取以一系列F开头的值,并且该行中必须有数值。 字母数字列是具有唯一值的唯一列,但其余列在我的表中包含重复值 此外,一旦提取出这些值,我想从重复行中提取最大值,例如: 假设我将F4737和F4700作为唯一的字母数字行,则必须从中提取F4737 我编写了一个类似这样的查询,但没有从该查询中提取数值: select max(Alplanume
F4737
,00Y778
,PP0098
,XXYYYYZ
等
我想提取以一系列F开头的值,并且该行中必须有数值。
字母数字列是具有唯一值的唯一列,但其余列在我的表中包含重复值
此外,一旦提取出这些值,我想从重复行中提取最大值,例如:
假设我将F4737
和F4700
作为唯一的字母数字行,则必须从中提取F4737
我编写了一个类似这样的查询,但没有从该查询中提取数值:
select max(Alplanumeric)
from Customers
where Alplanumeric '%[F0-9]%
或
我运行了上面的查询,但是如果我从上面的查询中删除数字部分,我只会得到F系列。如何同时提取F起始序列和该行中包含的数值?在肢体上,您可能正在寻找如下查询:
SELECT *, substring(alphanumeric, '^F(\d+)')::int AS nr
FROM customers
WHERE alphanumeric ~ '^F\d+'
ORDER BY nr DESC NULLS LAST
, alphanumeric
LIMIT 1;
中的
条件是正则表达式匹配,表达式锚定到起始位置,因此可以使用索引。理想情况下:
CREATE INDEX customers_alphanumeric_pattern_ops_idx ON customers
(alphanumeric text_pattern_ops);
这将返回以“F”开头的行中字母数字
中具有最高(提取)数值的一行,后跟一个或多个数字
关于索引:
理想情况下,您应该将前导文本和以下数值存储在单独的列中,以提高效率。您不一定需要更多像建议的那样的表。如果您想执行这样的操作,那么应该将值存储在一个连接表中,每个客户一行,每个代码一行。
like
不支持正则表达式。您需要使用与类似的,~
运算符或regexp\u matches()
。有关详细信息,请参阅手册:我不想分离连接表中的值或使用regexp匹配项,因为这会增加查询执行。我尝试了这个查询:从CustomerName类似“%4%”和CustomerName类似“F%”的客户中选择max(CustomerName),这个查询可以工作,但只适用于数值4。我也想在此查询中添加其他数值。如果不尝试,您怎么知道它“会增加查询执行”?顺便说一句:如“%[0-9]”
将在列中的任何位置查找具有[
后跟-
后跟]
的值。您的问题不清楚。请提供准确的表定义、一些示例行和预期结果。以有效的CREATE TABLE
和INSERT
语句的形式最佳。除此之外,“最大值”是不明确的。数字部分(视为数字)或文本值的最大值?永远是你的博士后版本。我想“Alplanumeric”是指“字母数字”吧?
CREATE INDEX customers_alphanumeric_pattern_ops_idx ON customers
(alphanumeric text_pattern_ops);