首页 > 解决方案 > 如何在 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', '5') WHERE 1 NOT IN (SELECT rno来自样本数据库);对于 StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1615281573937-132, container=default, section=132], offset=168254, length=152],offset=0 ,name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152] 由于关键字“WHERE”附近的语法不正确。;路由失败:com.microsoft.sqlserver.jdbc.SQLServerException:关键字“WHERE”附近的语法不正确。

无法弄清楚错误在哪里,或者有什么更好的方法来实现这一点。

标签: sqlsql-serverapache-nifiapache-nifi-registry

解决方案


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

  • 要使用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
);

推荐阅读