如何在nifi中执行SQL处理器中执行'NOT IN'子句

问题描述

我正在尝试使用 Apache nifi 中的“Executesql”处理器执行以下查询

INSERT INTO SampleDB VALUES (${rno},'${tno}','${tval}','${lotno}','${datval}') WHERE ${rno} NOT IN (SELECT rno FROM SampleDB);

这里的 ${rno} 是作为流文件属性获得的。

执行时出现如下错误

Executesql[id=01781107-63a4-1204-8110-6b19db3d5ffc] 无法执行 sql 选择查询 INSERT INTO LimsOnCloud VALUES (1,'CTG123 ','ITM123 ','123 '),'123 ','INE5 (从 SampleDB 中选择 rno);对于 StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1615281573937-132,container=default,section=1162],offset=145 offset=1162],name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152] 由于关键字“WHERE”附近的语法不正确。;路由失败:com.microsoft.sqlserver.jdbc.sqlServerException:关键字“WHERE”附近的语法不正确。

无法找出错误所在或实现此目标的更好方法是什么。

解决方法

  • 您应该使用正确的参数化查询。

  • 要使用这样的 WHERE,您需要 SELECT

  • 您还应该明确指定要插入的列名。

  • NOT IN 在可空值面前失败了,所以用 NOT EXISTS 代替。

INSERT INTO SampleDB
    (rno,tno,tval,lotno,datval)
SELECT @rno,@tno,@tval,@lotno,@datval
WHERE NOT EXISTS (SELECT 1
    FROM SampleDB
    WHERE rno = @rno
);
,

抛出错误是因为它试图在你的表中找到一个名为 1 的列,所以不要尝试上面的方法

INSERT INTO SampleDB SELECT ${rno},'${tno}','${tval}','${lotno}','${datval}' 
WHERE  NOT EXISTS (SELECT 1 FROM SampleDB WHERE rno = ${rno});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...