如何在 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 select查询INSERT INTO LimsOnCloud VALUES (1, 'CTG123 ', 'ITM123 ', '123 ', '5 ') WHERE 1 NOT IN (select rno FROM SampleDB);for StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourcecclaim = standardresourcecclaim [id=1615281573937-132, container=default, section=132], offset=168254, length=152],offset=0,name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152]由于关键字'WHERE'附近的语法不正确;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});

相关内容

  • 没有找到相关文章