如何根据字符串长度从数据库中获取数据而不使用任何字符串函数

时间:2012-08-06 09:31:12

标签: database jdbc multiple-databases string-length

我必须从表字段中获取记录,其中记录/数据/字符串的长度大于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);
}

除了上面编码的那个之外的任何其他想法?一个查询,可以获取所需的结果,而不是处理检索到的数据,然后获得所需的结果。

感谢您提供任何帮助/线索。

3 个答案:

答案 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计算下划线(_)字符并返回长度等于下划线字符数的名称。