有没有办法使用jdbc元数据或运行任何dbms特定查询来获取dbms支持的聚合函数列表?
答案 0 :(得分:1)
在SQL Server上,您可以查询安装目录中的XML:
DECLARE @xml XML
SELECT @xml = x.y
FROM OPENROWSET( BULK 'C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlToolsData\1033\SQLCommonObjects.xml', SINGLE_BLOB ) x(y)
;WITH XMLNAMESPACES( 'http://tempuri.org/SqlCommonObjects.xsd' AS ns )
SELECT
Category.Name.value('ns:DisplayName[1]', 'VARCHAR(MAX)') [Category],
[Function].Name.value('ns:Name[1]', 'VARCHAR(MAX)') [Function],
[Function].Name.query('for $p in ns:Parameters/ns:Parameter return
concat($p/ns:Name[1],",")').value('.', 'VARCHAR(MAX)') Parameters
FROM @xml.nodes('//ns:Category[ns:DisplayName="Aggregate Functions"]')
AS Category(Name)
CROSS APPLY Category.Name.nodes('ns:Objects/ns:Function') [Function](Name)
在BULK声明之后你应该给你的文件夹(区别主要是Program Files“和”Program_Files(x86)“和SQL server版本(100是2008年的例子)
答案 1 :(得分:0)
您的帖子有多个数据库标记,每个标记都有系统目录和/或信息模式,可以让您知道过程列表。查询的哪个表/视图将不同于数据库引擎,但是...(例如,在Postgres中,您将加入pg_proc和pg_aggregate,因为information_schema.routines不会告诉您哪些转换是聚合。)< / p>
通常可以安全地假设所有数据库实现中都存在典型的聚合函数(sum()
,count()
,avg()
...)。
我唯一知道的例外是Postgres,由于ambiguity in the syntax而不支持any()
/ some()
:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
答案 2 :(得分:0)
没有什么是全面的,因为它不是JDBC规范的一部分。如果您不知道在运行时使用的数据库引擎,最好的办法是向数据库提交测试查询,并在使用可能不支持的任何聚合函数之前检查它是否失败。