Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从varchar列中提取字母数字值_Sql_Postgresql_Greatest N Per Group_Sql Like_Alphanumeric - Fatal编程技术网

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