Oracle SQL:仅当另一表返回非空值时插入数据的实现问题
这个ORA-00933错误是因为你在INSERT ... VALUES后面加了WHERE子句——Oracle的INSERT ... VALUES语法根本不支持附带WHERE条件哦!这就好比你想给快递填地址,结果在地址栏后面加了个筛选条件,系统肯定懵了。
最简洁的解决方式是改用INSERT ... SELECT语法,把你的条件整合到查询里,这样只有当子查询返回非空值时才会插入数据:
INSERT INTO TABLE1 (IMG_CODE, NAME, AMOUNT) SELECT MAX(IM_CODE), 'Meal', 154 FROM IMAGE WHERE imf_file_name = 'dfkdf4564654.jpg' HAVING MAX(IM_CODE) IS NOT NULL;
这里用HAVING来过滤聚合后的结果(因为WHERE不能直接用聚合函数的结果),如果MAX(IM_CODE)是空的,这个SELECT就不会返回任何行,自然也就不会执行插入操作,完美匹配你的需求。
如果你更习惯用子查询的方式,也可以借助Oracle的DUAL虚拟表来实现,用EXISTS判断是否存在符合条件的非空值:
INSERT INTO TABLE1 (IMG_CODE, NAME, AMOUNT) SELECT (SELECT MAX(IM_CODE) FROM IMAGE WHERE imf_file_name = 'dfkdf4564654.jpg'), 'Meal', 154 FROM DUAL WHERE EXISTS ( SELECT 1 FROM IMAGE WHERE imf_file_name = 'dfkdf4564654.jpg' AND IM_CODE IS NOT NULL );
DUAL是Oracle用来生成单行数据的虚拟表,EXISTS子查询会检查IMAGE表中是否存在指定文件名且IM_CODE不为空的记录,只有存在时才会执行插入。
再回头说下你原来的问题:INSERT ... VALUES是用来插入固定值的单行数据,它的语法结构里没有WHERE的位置——Oracle根本不知道你加的WHERE是要干嘛,所以直接抛出了语法错误。而INSERT ... SELECT是从查询结果中插入数据,我们可以通过调整查询条件来控制是否有数据被插入,这才是符合Oracle语法规范的正确姿势。
内容的提问来源于stack exchange,提问作者Lemec Cinq
相关产品推荐
相关产品推荐

