我必须从表字段中获取记录,其中记录/数据/字符串的长度大于8个字符。我不能使用任何字符串函数,因为必须在(MySQL,MSSQL,Oracle)上使用查询。
我不想做以下示例:
List<String> names = new ArrayList<String>();
String st = select 'name' from table;
rs = executeSQL(st);
if ( rs != null )
{
rs.next();
names.add(rs.getString(1));
}
for(String name : names)
{
if(name.length() > 8)
result.add(name);
}
除了上面编码的那个之外的任何其他想法?一个查询,可以获取所需的结果,而不是处理检索到的数据,然后获得所需的结果。
感谢您提供任何帮助/线索。
答案 0 :(得分:1)
我认为您可能最好利用数据库的强大功能并为SQL语句实现factory(或者对于封装SQL功能的对象)。
通过这种方式,您可以使用数据库的名称/类型配置工厂,并为您提供适用于该数据库的SQL语句。它为您提供了一种参数化信息的简洁方法,同时允许您利用数据库的功能,而不必在代码中以次优的方式复制数据库功能。
e.g。
DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE);
String statement = fac.getLongNames();
// then use this statement. It'll be configured for each db type
进一步封装并使用类似的东西可能是明智的:
DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE);
List<String> names = fac.getLongNames();
这样你就不会做出假设了。常见的架构和查询方式等。
答案 1 :(得分:1)
JDBC驱动程序可以为JDBC规范的附录D(标量函数)中列出的函数实现JDBC转义。驱动程序应将其支持的标量函数转换为数据库端的相应函数。可以使用'DatabaseMetaData.getStringFunctions()'
查询支持的函数列表要在查询中使用此功能,您可以使用CHAR_LENGTH(string)
或LENGTH(string)
,例如:
SELECT * FROM table WHERE {fn CHAR_LENGTH(field)} > 8
您可以将CHAR_LENGTH
替换为LENGTH
。驱动程序(如果它支持此功能)将把它转换为底层数据库中的相应函数。
来自JDBC 4.1规范的 13.4.1标量函数:
附录D“标量函数”提供了标量函数的列表 预计司机会支持。需要驱动程序来实现 但是,仅当数据源支持这些函数时才具有这些功能。
标量函数的转义语法只能用于调用 附录D“标量函数”中定义的标量函数。转义 语法不用于调用用户定义的或供应商 具体的标量函数。
答案 2 :(得分:0)
我找到的另一个解决方案是:
Select name from table where name like '________';
SQL计算下划线(_)字符并返回长度等于下划线字符数的名称。