我目前正在将应用程序的一部分从Oracle移植到SQLite后端(Java,使用纯JDBC)。通常使用的一种Oracle特定功能是具有三个参数的INSTR函数:
INSTR(<字符串>,<搜索字符串>,<位置>)
此函数在字符串中搜索从某个位置开始的搜索字符串。第三个参数可以是正数或负数。如果为负,则搜索从字符串的末尾开始向后进行。
该功能在SQLite中不可用,而我能想到的最好的方法是通过嵌套其他一些功能来实现:
如果<position>为正:
LENGTH(<字符串>)-LENGTH(SUBSTR(SUBSTR(<字符串>,<位置>),STRPOS(SUBSTR(<字符串>,<位置>),<搜索字符串>)+ 1))
如果<position>为负(在我们的例子中,-1是唯一使用的负值):
LENGTH(<string>)-LENGTH(REPLACE(<string>,RTRIM(<string>,REPLACE(<string>,<search-string>,'')),''))
这似乎提供了预期的结果,但是您可以看到为什么我并不真正赞成这种方法。当然,因为在原始语法中,INSTR经常使用并且也被嵌套。此后成为维护的灾难。
是否有一种更优雅的方法,或者我可能缺少一些看似微不足道的任务的其他本机解决方案?