2015-02-06 65 views
-1

我在表具有类似于此值的列:选择语句来显示期望的输出

key_value 

例如:

3933984948498934_khkhk 
81299191ahgtyu092092092019_92982 
abh182772hjjlj98879bjj_122778999 

_是在所有的值常见。我需要一个脚本来复制值的一部分,即复制_之前的所有内容,并且不会在该列中的所有值之后显示_之后的任何内容。

我需要一个select语句来显示上面提到的输出。

如:实际值是3933984948498934_khkhk,但我只需要3933984948498934 实际值81299191ahgtyu092092092019_92982,但所需的输出是81299191ahgtyu092092092019

我觉得使用substr函数很麻烦,因为这些值是动态的。

+0

SUBSTR是好的,你也需要使用position来查找_。 (我希望位置支持Oracle,否则寻找类似的功能...) – jarlh 2015-02-06 16:35:36

+0

@jarhl - [INSTR](http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions080.htm) * 8) – 2015-02-06 16:37:01

回答

1

你可以使用正则表达式,例如:

SELECT REGEXP_SUBSTR(key_value, '^[^_]*') 
    FROM mytable; 

不过正则表达式是资源密集型;你会使用SUBSTR()INSTR()更好的服务:

SELECT SUBSTR(key_value, 1, INSTR(key_value, '_') - 1) 
    FROM mytable; 

注意,这后一种方法会失败(实际上,它会返回NULL)如果key_value不包含下划线_。所以你可以把它包装在COALESCE()

SELECT COALESCE(SUBSTR(key_value, 1, INSTR(key_value, '_') - 1), key_value) 
    FROM mytable;