我有相当脏的客户地址数据。对于每个客户端,一个字符串中有2个或更多地址。我想在Oracle中使用正则表达式减去第一个。
如果分隔符与';'
相同,将非常容易。但是有时会出现逗号。地址中也使用逗号分隔城市,街道和建筑物。
我有俄语地址,所以我为您翻译了它们。
例如,我有一个包含多个地址的字符串:
逗号是分隔符,但它也分隔地址内的块。
因此,我可以通过匹配所有内容直到第二个'\sul\.'
来匹配第一个地址。
但是我不怎么做。 Regexp_substr(address, '.*,\sul')
将返回
这远远超出了我的需要。
那么我怎么减去所有东西,直到第二,\sul\.
?
Russia, Moscow, ul. Tverskaya, d.32
应该返回。
答案 0 :(得分:1)
您可以使用SUBSTR
和INSTR
而不是正则表达式满足此要求。下面的表达式应该可以满足您的需求:
SUBSTR(v, 1, INSTR(v, ', ul.', 1, 2) - 1)
INSTR()
查找源字符串中字符串', ul.'
第二次出现的位置,SUBSTR()
选择从字符串开头到该位置(负1)的所有内容。 / p>
示例:
WITH t AS (
SELECT 'Russia, Moscow, ul. Tverskaya, d.32, ul. Yakimanka, d21, ul. Kalinina, d.43' address FROM DUAL
)
SELECT SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1) adress1 FROM t
| ADRESS1 | | :---------------------------------- | | Russia, Moscow, ul. Tverskaya, d.32 |
NB:只要在字符串中确实存在至少两次给定模式,此方法就起作用。如果碰巧具有与该规范不匹配的值并且要保留,则需要进行其他级别的测试,例如:
CASE INSTR(address, ', ul.', 1, 2)
WHEN 0 THEN address
ELSE SUBSTR(address, 1, INSTR(address, ', ul.', 1, 2) - 1)
END adress1