我正在尝试将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
答案 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
类型。