SQL仅获取带有前导数字的字符串

Posted

技术标签:

【中文标题】SQL仅获取带有前导数字的字符串【英文标题】:SQL to get only string with leading numbers 【发布时间】:2012-05-24 15:41:37 【问题描述】:

我认为这很简单。我只想返回查询结果中与前导数字联系的字符串值。

例如:

003 - Preliminary Examination Plan  
005 - Coordination  
1000a - Balance sheet
Advertising  
Amortization  
Partnerships

想得到:

003 - Preliminary Examination Plan  
005 - Coordination  
1000a - Balance sheet

这段代码给了我零个结果。如何检查前导数字是否包含数字并返回字符串的其余部分?

select distinct AIssue
from SQLIssue
where regexp_like( AIssue, '^[[:digit:]]*$' )
order by AIssue

【问题讨论】:

您使用的是哪个数据库系统? SQL 服务器?如果是这样,版本号也可能会影响答案。 这实际上是一个相当少见的名为 Livelink 的数据库系统,它使用 oracle 后端但它使用标准 sql 进行查询。 【参考方案1】:

您当前的正则表达式要求字符串完全由数字组成。请尝试以下操作:

where regexp_like( AIssue, '^[[:digit:]].*$' )

(注意添加的点)。

详细地说,. 匹配任何字符,* 表示“重复上一个词零次或多次”。

因此,原始正则表达式表示“零个或多个数字”,而上述正则表达式表示“一个数字后跟零个或多个任何字符

编辑:@mellamokb 在 cmets 中建议了上述正则表达式的较短版本:

where regexp_like( AIssue, '^[[:digit:]]' )

【讨论】:

这工作非常感谢!只是好奇添加的点有什么意义? @BvilleBullet:点表示“任何字符”,星号是重复运算符。我已经扩展了答案。 匹配^[[:digit:]]会不会更高效?它似乎有效:sqlfiddle.com/#!4/4b9ae/5 @mellamokb:好主意,谢谢。我已将其包含在答案中。 两种方法都可以得到正确的结果。也感谢您的解释。【参考方案2】:

如果您使用的是 SQL Server,请尝试以下操作:

select distinct Issue
 from SQLIssue
 where AIssue LIKE '[0-9]%'
 order by AIssue

查看LIKE的文档

【讨论】:

我在发布之前也尝试过,但我认为它给出的结果为零,因为整个字符串不会转换为数字。 LIKE 子句中的字符范围,例如,[0-9],是 SQL Server 特定的(以及其他几个 RDBMS 的)功能:***.com/questions/712580/…。由于您使用的是基于 Oracle 的产品,因此该查询不起作用。【参考方案3】:

另一种解决方案,但不涉及正则表达式:

select distinct Issue
from SQLIssue
where substr(AIssue, 1, 1) between '0' and '9'
order by AIssue 

【讨论】:

以上是关于SQL仅获取带有前导数字的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中输出带有前导零的数字? [复制]

SQL Server:如何从字符串中删除前导/尾随非字母数字字符?

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

从R中的字母数字字符中删除前导零

第128章 SQL函数 %SQLSTRING

格式化带前导符号的数字