如何让ignite的cast函数返回null而不是引发异常?

时间:2019-01-15 03:57:23

标签: java casting ignite

当我使用ignate的cast函数时,如果无法将源数据转换为目标类型,则ignite将抛出此异常:

  

javax.cache.CacheException:无法远程运行地图查询。无法在以下节点上执行地图查询:3ed8c3f3-31d3-4e18-a41c-83e2b6d4bf4a,类org.apache.ignite.IgniteCheckedException:无法执行SQL查询。无法解析“ DATE”常量“ xxxx”;

但是当它无法转换时,我需要它使用null来代替,就像Postgresql数据库一样。

我该怎么办?

点燃版本:2.6,JDBC版本:2.5

SELECT CAST(city AS DATE) AS `a1` FROM orders GROUP BY CAST(city AS DATE);

预期:

a1

Null

实际:

java.sql.SQLException: javax.cache.CacheException: Failed to run map query remotely.Failed to execute map query on the node: 3ed8c3f3-31d3-4e18-a41c-83e2b6d4bf4a, class org.apache.ignite.IgniteCheckedException:Failed to execute SQL query. Cannot parse "DATE" constant "xxxx"; SQL statement:
SELECT
CAST(__Z0.city AS DATE) __C0_0
FROM PUBLIC.ORDERS2 __Z0
GROUP BY CAST(__Z0.city AS DATE) LIMIT 3 [22007-195]
at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.sendRequest(JdbcThinConnection.java:751)
at org.apache.ignite.internal.jdbc.thin.JdbcThinStatement.execute0(JdbcThinStatement.java:210)
at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeWithArguments(JdbcThinPreparedStatement.java:252)
at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeQuery(JdbcThinPreparedStatement.java:78)
at com.uniplore.calculation.connectors.IgniteConnector.execute(IgniteConnector.java:58)
at tests.AbstractFunctionTransTest.getResult(AbstractFunctionTransTest.java:65)
at tests.IgniteFunctionTransTest.Date(IgniteFunctionTransTest.java:840)

2 个答案:

答案 0 :(得分:1)

PostgreSQL的CAST是如何工作的? groupby则有其他建议。

无论如何,您不能在Ignite中更改此行为。如果您使用相同的值xxxx作为占位符日期,则可以使用CASE作为解决方法:

SELECT CASE WHEN city = 'xxxx' THEN NULL ELSE CAST(city AS DATE) END AS a1 
FROM orders GROUP BY a1

答案 1 :(得分:0)

好的,我知道,CAST是应该返回异常的标准函数。

MySQL有一个名为DATE的函数,当转换失败时,该函数可以返回NULL值,除非ignite没有相应的函数。

最好的方法是将错误返回给用户,或者让用户使用PARSEDATETIME函数。