Postgres表the_table
有一个INTEGER列the_int_col
。
在NodeJS模块中,我有以下代码:
var values = [ '' ]; // Actual value is derived from other queries
const sql = 'INSERT INTO the_table ( the_int_col )VALUES ( $1::integer ) RETURNING id';
var res = await db.query( sql, values );
字符串
运行它,我得到这个错误:
错误:类型integer的输入语法无效:“”
我也试过:
const sql = 'INSERT INTO the_table ( the_int_col )VALUES ( NULLIF($1::integer, \'\') ) RETURNING id';
型
2条答案
按热度按时间k10s72fa1#
NULLIF几乎是正确的,你只需要稍后投:
字符串
mctunoxg2#
你所面临的问题是由于你在SQL查询中处理空字符串(“)到整数的转换的方式。在PostgreSQL中,空字符串不能直接转换为整数,这就是为什么你遇到错误invalid input syntax for type integer:“"。
使用NULLIF($1::integer,'')的第二种方法是正确的,但它的结构不正确。NULLIF应该在尝试将类型转换为integer之前使用。PostgreSQL中的NULLIF函数在两个参数相等时返回NULL;否则,它返回第一个参数。在您的情况下,您希望在输入为空字符串时返回NULL,然后将结果转换为整数。
以下是如何修改SQL查询:
字符串
在这个修改后的查询中,如果$1是空字符串,NULLIF($1,'')将返回NULL,否则返回$1本身。然后,::integer转换将正确处理NULL值(将它们保持为NULL),并将非空字符串转换为整数。
确保Node.js代码中的values数组被适当地填充。如果你期望整数或空字符串,这种方法应该可以正常工作。如果数组可能包含其他类型的数据,你可能需要在数据库查询之前进行额外的验证或转换逻辑。