假设我有一个表格列,结果如下:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
我希望能够编写一个从所述表中选择此列的查询,但只返回子字符串直到Underscore(_)字符。例如:
ABC
DEFGH
IJKLMNOP
SUBSTRING功能似乎不适合任务,因为它是基于位置的,下划线的位置也不同。
我想到了TRIM功能(特别是RTRIM功能):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
但是我不确定我是如何让它工作的,因为它似乎只删除某个列表/一组字符而且我只是在导致Underscore字符的字符之后。
答案 0 :(得分:126)
使用SUBSTR,INSTR和NVL的组合(对于没有下划线的字符串)将返回您想要的内容:
SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
FROM DUAL
output
------
ABC
SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
FROM YOUR_TABLE t
如果使用Oracle10g +,您可以通过REGEXP_SUBSTR使用正则表达式。
答案 1 :(得分:36)
这可以使用 REGEXP_SUBSTR 轻松完成。
请使用
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
其中 STRING_EXAMPLE 是您的字符串。
尝试:
SELECT
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)
from dual
它将解决您的问题。
答案 2 :(得分:7)
您需要获取第一个下划线的位置(使用INSTR),然后使用substr将第一个字符串的部分字符串获取到(pos-1)。
1 select 'ABC_blahblahblah' test_string,
2 instr('ABC_blahblahblah','_',1,1) position_underscore,
3 substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
4* from dual
SQL> /
TEST_STRING POSITION_UNDERSCORE RES
---------------- ------------------ ---
ABC_blahblahblah 4 ABC
答案 3 :(得分:5)
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
是正确的答案,由user1717270发布
如果您使用INSTR
,它将为您提供一个字符串的位置,该字符串假定其中包含“_”。如果没有怎么办?那么答案将是0.因此,当您想要打印字符串时,它将打印NULL
。
示例:如果要从“host.domain”中删除域。在某些情况下,您只有短名称,即“主机”。很可能你想打印“主机”。好吧,使用INSTR
它会给你一个NULL
,因为它没有找到任何“。”,即它会从0到0打印。使用REGEXP_SUBSTR
你会得到正确答案所有情况:
SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1) from dual;
HOST
和
SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1) from dual;
HOST
答案 4 :(得分:2)
另一种可能性是使用REGEXP_SUBSTR.
答案 5 :(得分:0)
如果列中的所有字符串都没有下划线,请记住这一点 (...或者如果null值将是输出):
SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1),
"STRING_COLUMN")
AS OUTPUT FROM DUAL
答案 6 :(得分:0)
从大字符串中查找任何子字符串:
string_value:=('This is String,Please search string 'Ple');
然后从'Ple'
找到字符串String_value
,我们可以这样做:
select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
您会找到结果:Ple
答案 7 :(得分:0)
如果String位置不固定,则在Select语句下面,我们可以获得预期的输出。
表结构 ID VARCHAR2(100字节) 客户端VARCHAR2(4000 BYTE)
数据-
ID CLIENT
1001 {“ clientId”:“ con-bjp”,“ clientName”:“ ABC”,“ providerId”:“ SBS”}
1002
{“ IdType”:“ AccountNo”,“ Id”:“ XXXXXXXX3521”,“ ToPricingId”:“ XXXXXXXX3521”,“ clientId”:“ Test-Cust”,“ clientName”:“ MFX”}
要求-在“客户”列中搜索“ ClientId”字符串并返回相应的值。像从“ clientId”:“ con-bjp”-> con-bjp(预期输出)
选择CLIENT,substr(substr(CLIENT,instr(CLIENT,'“ clientId”:“')+ length('” clientId“:”')),1,instr(substr(CLIENT,instr(CLIENT,' TEST_SC中的“ clientId”:“')+ length('” clientId“:”')),'“',1)-1)cut_str;
客户cut_str -------------------------------------------------- --------- ---------- {“ clientId”:“ con-bjp”,“ clientName”:“ ABC”,“ providerId”:“ SBS”} con-bjp {“ IdType”:“ AccountNo”,“ Id”:“ XXXXXXXX3521”,“ ToPricingId”:“ XXXXXXXX3521”,“ clientId”:“ Test-Cust”,“ clientName”:“ MFX”} Test-Cust