【问题标题】:SQL to get only string with leading numbersSQL仅获取带有前导数字的字符串
【发布时间】: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 进行查询。

标签: sql regex oracle


【解决方案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 的)功能:stackoverflow.com/questions/712580/…。由于您使用的是基于 Oracle 的产品,因此该查询不起作用。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多