获取字符串之前的所有内容,包括其自身 oracle
get everything before a string including itself oracle
我需要获取字符串之前的所有内容,包括它本身,然后用其他内容替换它。例如,如果我在列中的值为 28/29/81/732536/1496071,那么我想 select 81 之前的所有内容,包括它本身,即我想要 28/29/81 并将其替换为一些其他字符串。我试过下面的方法,但我只得到 28/29。
SELECT SUBSTR(eda.ATTRIBUTE_VALUE, 0, INSTR(eda.ATTRIBUTE_VALUE, '81')-2) AS output, ATTRIBUTE_VALUE
FROM EVENT_DYNAMIC_ATTRIBUTE eda
你可以使用这样的东西:
SELECT 'STRING_TO_REPLACE_WITH' || SUBSTR(eda.ATTRIBUTE_VALUE, INSTR(eda.ATTRIBUTE_VALUE, '81') + 2) AS output
FROM EVENT_DYNAMIC_ATTRIBUTE eda;
当 "token"(您的示例中的“81”)出现在两个斜杠之间,或恰好在字符串的开头和斜杠之前,或恰好在最后一个斜杠之后时,解决方案必须有效字符串末尾的斜杠。如果“81”作为 "token" 的一部分出现(在斜杠之间或第一个斜杠之前或最后一个斜杠之后),则它不应匹配。另外,如果 "token" 出现不止一次,它应该只被替换一次(和它之前的所有内容),如果它根本没有出现,那么原始字符串应该保持不变。
如果这些是规则,那么你可以像我下面展示的那样做。如果任何规则不同,可以修改解决方案以适应。
我创建了一些输入字符串来测试 WHERE 子句中的所有这些情况。我还在 WITH 子句的第二个子查询中创建了 "search token" 和 "replacement text"。应替换整个 WITH 子句——它不是解决方案的一部分,仅供我自己测试。在主查询中,您应该使用实际的 table 和列名称(and/or 硬编码文本)。
我使用 REGEXP_REPLACE 找到令牌并替换它和它之前的所有内容(但 不是 斜杠 after 它,如果有的话)与替换文本。我必须小心搜索标记后的斜杠;为此,我在 REGEXP_REPLACE 中的替换字符串中使用了反向引用。
with
event_dynamic_attribute ( attribute_value ) as (
select '28/29/81/732536/1496071' from dual union all
select '29/33/530813/340042/88' from dual union all
select '81/6883/3902/81/993' from dual union all
select '123/45/6789/81' from dual
),
substitution ( token, replacement ) as (
select '81', 'mathguy is great' from dual
)
select attribute_value,
regexp_replace (attribute_value, '(^|.*?/)' || token || '(/|$)',
replacement || '', 1, 1) new_attrib_value
from event_dynamic_attribute cross join substitution
;
ATTRIBUTE_VALUE NEW_ATTRIB_VALUE
----------------------- ----------------------------------------
28/29/81/732536/1496071 mathguy is great/732536/1496071
29/33/530813/340042/88 29/33/530813/340042/88
81/6883/3902/81/993 mathguy is great/6883/3902/81/993
123/45/6789/81 mathguy is great
我需要获取字符串之前的所有内容,包括它本身,然后用其他内容替换它。例如,如果我在列中的值为 28/29/81/732536/1496071,那么我想 select 81 之前的所有内容,包括它本身,即我想要 28/29/81 并将其替换为一些其他字符串。我试过下面的方法,但我只得到 28/29。
SELECT SUBSTR(eda.ATTRIBUTE_VALUE, 0, INSTR(eda.ATTRIBUTE_VALUE, '81')-2) AS output, ATTRIBUTE_VALUE
FROM EVENT_DYNAMIC_ATTRIBUTE eda
你可以使用这样的东西:
SELECT 'STRING_TO_REPLACE_WITH' || SUBSTR(eda.ATTRIBUTE_VALUE, INSTR(eda.ATTRIBUTE_VALUE, '81') + 2) AS output
FROM EVENT_DYNAMIC_ATTRIBUTE eda;
当 "token"(您的示例中的“81”)出现在两个斜杠之间,或恰好在字符串的开头和斜杠之前,或恰好在最后一个斜杠之后时,解决方案必须有效字符串末尾的斜杠。如果“81”作为 "token" 的一部分出现(在斜杠之间或第一个斜杠之前或最后一个斜杠之后),则它不应匹配。另外,如果 "token" 出现不止一次,它应该只被替换一次(和它之前的所有内容),如果它根本没有出现,那么原始字符串应该保持不变。
如果这些是规则,那么你可以像我下面展示的那样做。如果任何规则不同,可以修改解决方案以适应。
我创建了一些输入字符串来测试 WHERE 子句中的所有这些情况。我还在 WITH 子句的第二个子查询中创建了 "search token" 和 "replacement text"。应替换整个 WITH 子句——它不是解决方案的一部分,仅供我自己测试。在主查询中,您应该使用实际的 table 和列名称(and/or 硬编码文本)。
我使用 REGEXP_REPLACE 找到令牌并替换它和它之前的所有内容(但 不是 斜杠 after 它,如果有的话)与替换文本。我必须小心搜索标记后的斜杠;为此,我在 REGEXP_REPLACE 中的替换字符串中使用了反向引用。
with
event_dynamic_attribute ( attribute_value ) as (
select '28/29/81/732536/1496071' from dual union all
select '29/33/530813/340042/88' from dual union all
select '81/6883/3902/81/993' from dual union all
select '123/45/6789/81' from dual
),
substitution ( token, replacement ) as (
select '81', 'mathguy is great' from dual
)
select attribute_value,
regexp_replace (attribute_value, '(^|.*?/)' || token || '(/|$)',
replacement || '', 1, 1) new_attrib_value
from event_dynamic_attribute cross join substitution
;
ATTRIBUTE_VALUE NEW_ATTRIB_VALUE
----------------------- ----------------------------------------
28/29/81/732536/1496071 mathguy is great/732536/1496071
29/33/530813/340042/88 29/33/530813/340042/88
81/6883/3902/81/993 mathguy is great/6883/3902/81/993
123/45/6789/81 mathguy is great