如何在oracle中删除破折号后的文本?
Posted
技术标签:
【中文标题】如何在oracle中删除破折号后的文本?【英文标题】:How to remove text following a dash in oracle? 【发布时间】:2011-06-01 13:58:52 【问题描述】:我在看
replace('ABC-DEF', '-')
和
regexp_replace('ABC-DEF', '-$')
帮助我删除破折号后的所有字符,但我无法找到与我想要做的匹配的好的函数或表达式。有什么好的 oracle 表达式可以做到这一点?
ABC-DEF => ABC
【问题讨论】:
【参考方案1】:我只会使用 substr 来完成所有内容:
select substr(str, 1, instr(str, '-')-1) new_str
from
(
select 'ABC-DEF' str
from dual
)
【讨论】:
【参考方案2】:使用正则表达式:
regexp_replace('ABC-DEF', '-.*')
【讨论】:
【参考方案3】:SUBSTR('ABC-DEF', 1, INSTR('ABC-DEF', '-')-1)
【讨论】:
【参考方案4】:select substr('hello-dolly', 1, instr('hello-dolly', '-')-1) from dual
【讨论】:
【参考方案5】:SELECT regexp_replace('ABC-DEF', '[-]',NULL) FROM dual; SELECT regexp_replace('ABC-DEF-GHI-JKL', '[-]',NULL) FROM dual;
或者使用我称为 FIELD 的酷函数:
CREATE OR REPLACE FUNCTION field(i_string VARCHAR2
,i_delimiter VARCHAR2
,i_occurance NUMBER
,i_return_number NUMBER DEFAULT 0
,i_replace_delimiter VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
v_return_string VARCHAR2(32767);
n_start NUMBER := i_occurance;
v_delimiter VARCHAR2(1);
n_return_number NUMBER := i_return_number;
n_max_delimiters NUMBER := regexp_count(i_string, i_delimiter);
BEGIN
IF i_return_number > n_max_delimiters THEN
n_return_number := n_max_delimiters + 1;
END IF;
FOR a IN 1 .. n_return_number LOOP
v_return_string := v_return_string || v_delimiter || regexp_substr(i_string, '[^' || i_delimiter || ']+', 1, n_start);
n_start := n_start + 1;
v_delimiter := nvl(i_replace_delimiter, i_delimiter);
END LOOP;
RETURN(v_return_string);
END field;
用法: SELECT field('Hello-Dolly', '-', 1, 2) Entire_string ,field('Hello-Dolly', '-', 1, 1) First_part ,field('Hello-Dolly', '-', 2, 1) Second_part 从双;
【讨论】:
以上是关于如何在oracle中删除破折号后的文本?的主要内容,如果未能解决你的问题,请参考以下文章