首页 > 解决方案 > 为什么我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?

问题描述

我正在设置一个 .NET 程序来操作我们 Redshift 数据库中的一些数据。我的大多数命令都没有问题,但是当我尝试在 select 中执行涉及 CONVERT 函数的 INSERT 语句时,它会用文本“TODO:FUNC”替换整个 CONVERT 函数,然后我得到这个错误:

System.Data.Odbc.OdbcException (0x80131937):错误 [42601] [Amazon][Amazon Redshift] (30) 尝试执行查询时发生错误:[SQLState 42601] 错误:“:”第 1 行或附近的语法错误: ...如果 package_size 为空,则为空,否则 TODO: FUNC end...

SQL 命令在 Aginity Workbench 中运行且没有错误。如果我取出 CONVERT 函数,我会收到一个错误,即我的类型不匹配。

OdbcConnection conn = new OdbcConnection(connString);
conn.Open();

string sql = "truncate table sch.table; insert into sch.table (package_size) select case when package_size is null then null else convert(numeric(9,3),left(package_size,6) || '.' || right(package_size,3)) end as package_size from sch.stage_table;";

OdbcCommand da = new OdbcCommand(sql, conn);
da.ExecuteNonQuery();

conn.Close();

标签: c#.netamazon-redshift

解决方案


出于任何原因,此场景中的 CONVERT 函数不起作用。但是您可以使用 CAST 来代替它。

CAST ( expression AS type )
expression :: type

在你的情况下:

cast(left(package_size,6) || '.' || right(package_size,3) as numeric(9,3))

官方文档:https ://docs.aws.amazon.com/redshift/latest/dg/r_CAST_function.html


推荐阅读