我想創建一個回傳表記錄或無/無效的 sql 函式
CREATE OR REPLACE function testfunc(value bigint)
RETURNS TABLE(severity int, maxvalue bigint) AS $$
SELECT CASE
WHEN (value > 30) THEN (10, 30)
WHEN (value > 60) THEN (15, 45)
ELSE -- return void or no rows
END
$$
language sql stable strict;
SELECT * FROM testfunc(29)
uj5u.com熱心網友回復:
不要回傳 CASE 運算式,使用帶有 WHERE 條件的 SELECT:
CREATE OR REPLACE function testfunc(value bigint)
RETURNS TABLE(severity int, maxvalue bigint)
AS $$
SELECT 10,30
where value > 30
union all
select 15, 25
where value > 60;
$$
language sql stable strict;
如果您傳遞的值不滿足任何條件,這將回傳一個空結果集。
一種更靈活的方法可能是設定“值范圍”和要回傳的結果之間的映射。然后可以將輸入值與一系列整數進行比較
CREATE OR REPLACE function testfunc(value bigint)
RETURNS TABLE(severity int, maxvalue bigint)
AS $$
with data (severity, maxvalue, value_range) as (
values
(10,30, int8range(30,60,'()') ),
(15,25, int8range(60,null,'()') )
)
SELECT severity, maxvalue
from data
where value_range @> value;
$$
language sql
stable strict;
正如您用于>比較的那樣,我通過包含的下限將范圍定義為兩個邊界的獨占范圍,'()'而獨占的上限將是'[)'. 手冊中的更多細節。
您甚至可以考慮將此定義放入表中,這樣您就可以更改它而無需每次都重新創建函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448985.html
標籤:sql PostgreSQL 功能
上一篇:接受組合列中的引數以檢索多條記錄
