postgres检查是否为null然后转换为数字

use*_*201 2 postgresql

我正在尝试检查一个值是否为null,如果是这样,select null否则转换为数字,但它会引发错误.这实际上是insert语句的一部分

INSERT into someTable(name,created,power) 
SELECT 'xyz',now(),
case when :power ='null' then NULL else cast(:power as numeric) end from abc 
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

Error: ERROR: invalid input syntax for type numeric: "null"
Run Code Online (Sandbox Code Playgroud)

:power是一个变量,可以使用java代码赋予任何值.如果我给出null值,则会给出错误.

在代码中,我从java堆栈跟踪中得到以下错误

org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to numeric
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 7

错误:

SELECT CASE WHEN 'null' = 'null' THEN NULL ELSE cast('null' AS numeric) END 
Run Code Online (Sandbox Code Playgroud)

没错误:

DO $$
DECLARE
    power text := 'null';
BEGIN
    PERFORM CASE WHEN power = 'null' THEN NULL ELSE cast(power AS numeric) END;
END;
$$
Run Code Online (Sandbox Code Playgroud)

说明:

如果你构建一个查询字符串,那么表达式cast('null' AS numeric)或者'null'::numeric 总是引发一个异常,即使在一个ELSE永远不会被执行的块中也是如此,因为它是invalid input syntax异常,并且在语法检查期间引发了异常(如错误消息所暗示的),而不是在执行期间.

CASE像你这样的陈述只对参数或变量有意义,而不是文字.在汇编查询字符串之后,文字的第二个实例与第一个实例没有任何关联.

对于像这样的动态SQL,您需要构建查询字符串之前检查该值.或者使用函数或预准备语句并将值作为参数传递.那也行.


评论后的更多建议:

在您的特定情况下,您可以检查应用程序中的值并构建一个查询字符串,如下所示:

INSERT INTO tbl(name, abc_id, created, power) 
SELECT 'xyz'
     , abc_id
     , now()
     , <insert_value_of_power_or_NULL_here> -- automatically converted to numeric
FROM   abc
Run Code Online (Sandbox Code Playgroud)

您可能对以有条件方式从文件中插入数据不同方法感兴趣.
使用COPY的文件服务器的本地或psql的元命令\副本的文件本地客户端.


ram*_*igg 5

如果字段值为null,并且您希望在这种情况下将其映射到某个值,则可以使用coalesce(field_name, 'Some value')coalesce(field_name, 123).
有关完整文档,请参见这里.