当我使用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)
答案 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函数。