【问题标题】:Parsing subfields in SQL在 SQL 中解析子字段
【发布时间】:2013-04-22 20:07:37
【问题描述】:

我有下表

DRIVER_GID              DRIVER_REFNUM_QUAL_GID  

SDL2/C001.100000        SDL2.486900 CURRENT DISTRICT 
SDL2/C001.100000        SDL2.486900 PERMANENT DISTRICT 
SDL2/C001.100000000     SDL2.486900 CURRENT DISTRICT  
SDL2/C001.100000000     SDL2.486900 PERMANENT DISTRICT 
SDL2.600119036          SDL2.436001 CURRENT DISTRICT  
SDL2.600119036          SDL2.436001 PERMANENT DISTRICT 

我需要提取字符串“SDL2”后面的数值。来自 DRIVER_REFNUM_QUAL_GID 列。谁能推荐一个查询。

【问题讨论】:

  • 请参阅codeproject.com/Articles/7938/… 以获得应该可行的解决方案。
  • 您使用的是哪个 DBMS?
  • 是“SDL”后面的数字。总是从位置 6 和 6 个字符宽开始?如果是这样,一个简单的substr(driver_refnum_qual_gid, 6, 6) 将提取您想要的字符串。
  • 我们使用Oracle,“SDL”并不总是从第6位开始,位置可能会改变。但 ”。”是常数并且在“.”之后应该有一个数字值,后跟空格和当前或永久区字。
  • 您需要这样做的事实表明您可能有一个非常糟糕的数据设计。单独存储数值。

标签: sql oracle


【解决方案1】:

使用ORACLEregexp_substr函数:

select regexp_substr(DRIVER_REFNUM_QUAL_GID, '[[:digit:]]{6}') from YOURTABLE

这将从您的表格的 DRIVER_REFNUM_QUAL_GID 列中提取相邻的 6 位数字。

如果您希望提取句点之后的所有数字,请使用以下代码:

select regexp_substr(DRIVER_REFNUM_QUAL_GID, '(\.)([[:digit:]]+)',1,1,'i',2) from YOURTABLE

要消除NULLS,可以使用NVL函数。

例如,

select NVL(regexp_substr(DRIVER_REFNUM_QUAL_GID, '(\.)([[:digit:]]+)',1,1,'i',2),999999) from YOURTABLE

所以,如果regexp_substr 函数的结果是NULL,那么结果就是999999

【讨论】:

  • 试过:select regexp_replace(DRIVER_REFNUM_QUAL_GID, '[^[:digit:]]') from DRIVER_REFNUM ## Result: java.sql.SQLException: Invalid column index, 我想我们快了让我知道确切的 sql
  • 这不允许在点后面有可变数量的数字。
  • @bonsvr 执行查询时出现无效列索引错误
  • SQL 部分运行正常,似乎是 Java 错误。检查这个 [链接] : (stackoverflow.com/questions/5969081/…)
  • 我使用的是 html sql 编辑器,当我更换编辑器时它工作正常。您能否也将结果集中没有 null 或空值的 sql 发送给我
【解决方案2】:

考虑到您只需要 SDL2. 之后的数字,并且考虑到位数最多可以达到 20 位,您可以使用类似的东西-

select REGEXP_SUBSTR('SDL2.486900 CURRENT DISTRICT', '[[:digit:]]{2,20}') numval from dual;

您可以根据需要编辑号码20

所以它看起来像-

select REGEXP_SUBSTR(DRIVER_REFNUM_QUAL_GID,'[[:digit:]]{2,20}') from your_table;

【讨论】:

  • 我只想要486900,能不能把sql发给我
  • @user2146080 编辑了我的答案。
猜你喜欢
  • 2010-10-19
  • 2021-09-10
  • 2021-12-28
  • 2020-04-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多