我目前正在将应用程序的一部分从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经常使用并且也被嵌套。此后成为维护的灾难。
是否有一种更优雅的方法,或者我可能缺少一些看似微不足道的任务的其他本机解决方案?
我很好奇如何以最一般的方式正式模拟SQLite的RPAD和LPAD函数.目标是能够做到
LPAD(column, character, repeat)
RPAD(column, character, repeat)
Run Code Online (Sandbox Code Playgroud)
对于非固定表列column,character,repeat.如果character并且repeat是已知的常数,那么这将是一个好的,可行的解决方案:
但是如果上面的内容应该像这样执行呢:
SELECT LPAD(t.column, t.character, t.repeat) FROM t
SELECT LPAD(t.column, some_function(), some_other_function()) FROM t
SELECT LPAD(t.column, :some_bind_variable, :some_other_bind_variable) FROM t
Run Code Online (Sandbox Code Playgroud)
如何LPAD通常模拟此功能?我迷失了各种可能性:
一个相关的问题:
使用JDBC存在一些限制,数据库依赖性是其中一个限制.
是否有任何模式或方法可以在JDBC中实现数据库独立性(不使用任何其他ORM框架或工具).
我试图通过动态多态来实现这一点(根据特定的SQL语法为不同的DBMS创建特定的类并覆盖常见的CRUD操作).
例如,有没有办法编写通用SQL语句,以便它们几乎可以在每个SQL相关的DBMS中执行?