Oracle选择值到第一个空格或行尾

时间:2016-03-15 12:46:58

标签: sql oracle

我需要运行每周提取并从外部数据库更新查阅列值。我面临的问题是我的查询列x_ids包含可变长度和模式的字符串值,即

查找表

x_ids
------
CHE00r
NWA048
HAM54O1A
STR191O1C

我的问题是,为更新选择的某些值还包括值后面的空格和括号。即STR191O1C以上可反映STR191O1C(250)

我已尝试以下选择进行更新: -

select substr(b.x_ids,1,instr(b.x_ids,' ',1,1) - 1)
from lookup_tab a, external_tab b
where a.site_id = B.SITE_ID
and a.zone_id = b.zone_id

这将删除括号中的数字并提供我正在查找的值,但也不返回没有括号或空格的其他行的值。 如果没有空格,则需要将所有值返回到行尾,如果存在,则需要返回空格。

2 个答案:

答案 0 :(得分:3)

您可以通过在搜索空格之前向字符串添加空格来轻松调整逻辑以处理此问题:

select substr(b.x_ids, 1, instr(b.x_ids || ' ', ' ', 1, 1) - 1)
from lookup_tab a join
     external_tab b
     on a.site_id = B.SITE_ID and a.zone_id = b.zone_id

答案 1 :(得分:0)

您可以使用正则表达式执行此操作:

SELECT REGEXP_SUBSTR( b.x_ids, '^(.*?)($| )', 1, 1, NULL, 1 )
FROM   lookup_tab a
       JOIN external_tab b
       ON   a.site_id = B.SITE_ID and a.zone_id = b.zone_id

或使用CASE声明:

SELECT CASE WHEN INSTR( b.x_ids, ' ' ) = 0 THEN b.x_ids
            ELSE SUBSTR( b.x_ids, 1, INSTR( b.x_ids, ' ' ) - 1 )
            END
FROM   lookup_tab a
       JOIN external_tab b
       ON   a.site_id = B.SITE_ID and a.zone_id = b.zone_id

或者:

SELECT SUBSTR(
         b.x_ids,
         1,
         CASE WHEN INSTR( b.x_ids, ' ' ) > 0 THEN INSTR( b.x_ids, ' ' ) - 1 END
       )
FROM   lookup_tab a
       JOIN external_tab b
       ON   a.site_id = B.SITE_ID and a.zone_id = b.zone_id