微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。