0

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

除了上面编码的那个之外还有什么想法吗?可以获取所需结果的查询,而不是对检索到的数据进行处理然后获取所需结果。

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

4

3 回答 3

1

JDBC 驱动程序可以为 JDBC 规范的附录 D(标量函数)中列出的函数实现 JDBC 转义。驱动程序应将其支持的标量函数转换为数据库端的适当函数。可以使用“DatabaseMetaData.getStringFunctions()”查询支持的函数列表

要在查询中使用它,您可以使用CHAR_LENGTH(string)LENGTH(string)喜欢:

SELECT * FROM table WHERE {fn CHAR_LENGTH(field)} > 8

您可以替换CHAR_LENGTHLENGTH. 驱动程序(如果它支持此功能)然后会将其转换为基础数据库中的适当功能。

从JDBC 4.1 规范的第13.4.1 节标量函数:

附录 D“标量函数”提供了一个驱动程序应该支持的标量函数列表。但是,只有当数据源支持这些函数时,驱动程序才需要实现这些函数。

标量函数的转义语法只能用于调用附录 D“标量函数”中定义的标量函数。转义语法不打算用于调用用户定义的或供应商特定的标量函数。

于 2012-08-06T09:49:07.677 回答
1

我认为您最好利用数据库的强大功能并为您的 SQL 语句(或者可能为封装 SQL 功能的对象)实现一个工厂。

这样您就可以使用数据库的名称/类型来配置您的工厂,它会为您提供该数据库的适当 SQL 语句。它为您提供了一种参数化此信息的简洁方法,同时允许您利用数据库的功能,而不必在代码中以次优方式复制数据库功能。

例如

   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();

这样你就不会做出假设。通用模式和查询方式等。

于 2012-08-06T09:40:15.080 回答
1

我发现的另一个解决方案是:

Select name from table where name like '________';

SQL 计算下划线 (_) 字符并返回长度等于下划线字符数的名称。

于 2012-08-08T11:03:55.450 回答