使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误

Posted

技术标签:

【中文标题】使用 CASE WHEN 语句时出现 RODBC“无效字符\\n”错误【英文标题】:RODBC "invalid character\n" error when using CASE WHEN statement使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误 【发布时间】:2014-07-09 19:34:58 【问题描述】:

我正在尝试使用 R 中的 RODBC 在 Oracle SQL 数据库上执行一个简单的“if/then”语句。该 SQL 语句在 SQL Developer v4.0.2.15 中运行良好,但在执行相同的语句时会引发错误回复

sqlQuery(channel, "
select
    Variable1,
    Variable2,
    CASE WHEN Variable1 = 0 then 0 else 1 end as Var3
from schema.TABLE
where ROWNUM<100;
           "
  )

错误信息(更新):

[1] "[1] "HY000 936 [Oracle][ODBC][Ora]ORA-00936: missing expression\n"
[2] "[2] ... 

删除 CASE WHEN 行时该语句工作正常,因此错误必须在 CASE WHEN 语法中。

【问题讨论】:

没关系。评论已撤销。 除了错误消息中的查询与您发布的内容不匹配之外,错误本身也不是您在标题中输入的内容。您能否验证问题中的代码和错误是否同步? (我希望“无效字符”最后是分号,但不确定 RODBC 是否会像 JDBC 那样介意)。 Alex P - 我已经更正了错误信息 尝试使用 DECODE(Variable1,0,0,1) 代替 case 语句。 解码确实有效,谢谢!您还可以链接 if/else 语句,以便它很好地处理流程控制:SELECT supplier_name, DECODE(supplier_id, 10000, 'IBM', 10001, 'Microsoft', 10002, 'Hewlett Packard', 'Gateway') result FROM providers; 【参考方案1】:

我发现分号有时会在这种情况下导致问题。

> sqlQuery(con, "select case when dummy = 'X' then 1 else 0 end from dual")
  CASEWHENDUMMY='X'THEN1ELSE0END
1                              1

> sqlQuery(con, "select case when dummy = 'X' then 1 else 0 end from dual;")
[1] "HY000 911 [Oracle][ODBC][Ora]ORA-00911: invalid character\n"                                       
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select case when dummy = 'X' then 1 else 0 end from dual;'"
> close(con)

【讨论】:

当我删除 sql 结束分号时,我解决了我的问题(一个 [R] RODBC::sqlQuery()),所以 thnx @logworthy。【参考方案2】:

如果您查看 SQL 语句(似乎完整地出现在错误消息中),我们会看到:

    '\nselect\n    UW_NET_ULTIMATE_LOSS_USD,\n    UW_NET_WRITTEN_PREMIUM_USD,\n    
IF UW_NET_WRITTEN_PREMIUM_USD = 0 THEN testvar=0 ELSE testvar=1 end\n
from bqiread.POLICY_METRICS\nwhere ROWNUM<100;\n 

这里没有 CASE 语句....它似乎是一个 IF/THEN/ELSE,这不是有效的 Oracle 语法。

也许您的工具正在为与 Oracle 不同的 RDBMS 生成 SQL,并尝试在 Oracle 中执行它?

【讨论】:

我同意 OP 需要解决这种差异。作为一个 RODBC 连接到 Oracle 的日常用户,我认为 RODBC 生成不正确的 SQL 或错误消息不反映实际传递给它的查询是非常不寻常的。 Joran- 作为日常用户,您是否曾经合并过 CASE WHEN 语句?您是否从 Oracle 查询? @Tim_K 是的,经常。我几乎从不直接在 Oracle 工作。我通过 RODBC 或 ROracle 查询它。而且我一直使用 case 语句。

以上是关于使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式

sql语句借助case when实现自动拼装where条件

尝试连接数据库时出现 RODBC 错误代码 202

使用 Load when 子句时出现问题?

在 CASE WHEN 中何处使用 NULLIF?

SQL语句中case,when,then的用法