我想从最后'/'和最后''之间的列中的字符串中获取子字符串。
以下是IMAGE_PATH列名称的示例日期:
sph/images/30_Fairhall_Court.jpeg
sph/images/9_Pennethorne_House.jpeg
rbkc/images/TAVISTOCK_CRESCENT.jpeg
haringey/images/399932thumb.jpg
urbanchoice/images/18190862.jpg
wandle/images/f13c10d2-2692-457d-a208-8bb9e10b27dc.png
housingmoves/images/No14_Asterid Heights_DS37620.jpg
wandle/images/f13c10d2-2692-457d-a208-8bb9e10b27dc.png
所以所需的输出就像
30_Fairhall_Court
9_Pennethorne_House
TAVISTOCK_CRESCENT
399932thumb
18190862
f13c10d2-2692-457d-a208-8bb9e10b27dc
No14_Asterid Heights_DS37620
f13c10d2-2692-457d-a208-8bb9e10b27dc
请建议如何获取。我需要使用此值更新表中的另一个空白列。该表约有10个缺乏记录。
答案 0 :(得分:0)
此正则表达式适用于您提供的示例数据:
select regexp_substr(image_path
, '(/)([a-z0-9_ \-]+)(\.)([a-z]+)$'
, 1
, 1
, 'i'
, 2)
from t23
/
我们必须在pattern
之后包含所有可选参数,以便我们可以使用subexpr
参数来仅选择文件名元素。 Find out more。
就更新而言,一百万行表并不大。鉴于您必须更新所有行,您可以做很多事情来调整它。只需发出UPDATE语句并让它翻录。
"它无效"
嗯,这里a SQL Fiddle which proves it does work。你可能引入了一个拼写错误。
"正则表达式看起来不必要复杂。为什么不简单"
也许这太复杂了。但是,如果IMAGE_PATH中有多个点,则简化版本不会产生正确的结果。如果这种情况永远不会发生,那么您的解决方案就可以正常运行。
答案 1 :(得分:0)
可能的解决方案之一是使用带有负第三参数的函数substr()和instr():
select image_path,
substr(image_path,
instr(image_path, '/', -1) + 1,
instr(image_path, '.', -1)-instr(image_path, '/', -1) - 1) img
from test
结果:
IMAGE_PATH IMG
-------------------------------------------------------- -------------------------------------
sph/images/30_Fairhall_Court.jpeg 30_Fairhall_Court
sph/images/9_Pennethorne_House.jpeg 9_Pennethorne_House
rbkc/images/TAVISTOCK_CRESCENT.jpeg TAVISTOCK_CRESCENT
haringey/images/399932thumb.jpg 399932thumb
urbanchoice/images/18190862.jpg 18190862
wandle/images/f13c10d2-2692-457d-a208-8bb9e10b27dc.png f13c10d2-2692-457d-a208-8bb9e10b27dc
housingmoves/images/No14_Asterid Heights_DS37620.jpg No14_Asterid Heights_DS37620
wandle/ima.ges/f13c10d2-2692-457d-a208-8bb9e10b27dc.png f13c10d2-2692-457d-a208-8bb9e10b27dc