Sql 在Oracle中解析字符串中的第二个单词
我需要编写一点SQL来解析任何给定字符串的第二个字,或者如果没有空格,则解析整个字符串 逻辑是 “XXX-yyy-ZZZZZ”将返回yyy “XXX YYY”将返回YYY和 “XXXXXX”将返回XXXXXX 有什么建议吗?有没有办法使用SUBSTR和字符串中的2个位置?而不是使用长度Sql 在Oracle中解析字符串中的第二个单词,sql,oracle10g,Sql,Oracle10g,我需要编写一点SQL来解析任何给定字符串的第二个字,或者如果没有空格,则解析整个字符串 逻辑是 “XXX-yyy-ZZZZZ”将返回yyy “XXX YYY”将返回YYY和 “XXXXXX”将返回XXXXXX 有什么建议吗?有没有办法使用SUBSTR和字符串中的2个位置?而不是使用长度 非常感谢如果您了解正则表达式,这可能会简单一些: case -- at least two words when instr(c, ' ', 1, 1) > 0 then
非常感谢如果您了解正则表达式,这可能会简单一些:
case
-- at least two words
when instr(c, ' ', 1, 1) > 0 then
case
-- at least three words
when instr(c, ' ', 1, 2) > 0 then
-- return text between first and last space
substr(
c
, instr(c, ' ', 1, 1)+1
, instr(c, ' ', 1, 2) - instr(c, ' ', 1, 1) - 1
)
else
-- return 2nd word (text after first space)
substr(c, instr(c, ' ', 1, 1)+1)
end
-- one word, return it
else c
end
SELECT CASE WHEN REGEXP_COUNT('STRING', ' ') > 0 THEN
REGEXP_SUBSTR ('STRING', '(\s)(\S*)',1,1)
ELSE
'STRING'
END
FROM DUAL
使用“instr(c),,1,2)-instr(c),,1,1)-1”逻辑。再次谢谢你,这肯定是件麻烦事。在MySQL中,我可能会使用
SUBSTRING\u INDEX()
函数,这将大大减少混乱。这可能会很麻烦,但在Oracle中,您将逻辑放在自己的实用程序包中,并且可以随时使用。我同意,这是一种可能性。然而,确切的实施是值得考虑的。就我个人而言,我不太喜欢在实用程序包上创建依赖项,至少在您需要它们的模式中不包含这些依赖项的时候。即便如此,字符串操作也必须如此笨拙,这是一个遗憾。这不仅仅是PL/SQL,其他SQL方言中也存在同样笨重的字符串操作函数。