无法将plpgsql中的自定义类型对象设置为null。相反,该对象的字段变为null

时间:2019-03-27 21:26:01

标签: sql postgresql plpgsql

我正在尝试将null附加到自定义类型对象上。但是只有该对象内部的字段变为空,而不是对象本身。

我尝试使用FOUND标志来确定是否有任何行分配给我的对象。如果发现为false,则将自定义类型对象设置为null。但是当我打印对象时,在pgadmin控制台中它看起来像(,,,,,,)。

SELECT * 
  FROM table
  WHERE  
       ( CASE 
          WHEN left(code,2) IN ('XX', 'YY') and geoview = 'PO'  THEN 0
          WHEN left(code,2) IN ('XX', 'YY') and geoview = 'FIN' THEN 1 
          WHEN geoview = 'PO' THEN 1
          ELSE 0
        END ) > 0

我希望

Select id,provider_id,beneficiary_name,beneficiary_branch,beneficiary_account_number,swift_code,
    payment_terms,currency,bank_name,payment_entity,payment_type,invoice_due_date_type,last_updated_time
    INTO provider_payment_method_result
    from provider_info.provider_payment_method where provider_id = provider_id_param;
    IF NOT FOUND
       THEN provider_payment_method_result := NULL::provider_info_api.payment_method;
    END IF;
    raise notice 'found : %', found;
    raise notice 'payment_method % ', provider_payment_method_result;
    return provider_payment_method_result;

实际结果

NOTICE: found : f NOTICE: payment_method null

1 个答案:

答案 0 :(得分:2)

这取决于PostgreSQL的版本。如果PostgreSQL的版本早于10,则应按您描述的方式运行。在所有字段中均为NULL的行(或复合值)实际上是NULL。在这些版本上,复合值每次都会从值传递(从SQL角度来看),并且不能表示为一个值(尽管该值为NULL)。

在PostgreSQL 10及更高版本上,此行为已更改。

CREATE TYPE xy AS (x int, y int);

DO $$
DECLARE _xy xy;
BEGIN
  _xy := (NULL, NULL);
  RAISE NOTICE '% %', _xy, _xy IS NULL;
END;
$$;

如果您使用的是较旧的Postgres,而您只会看到NULL,请改用RECORD类型。