我有一个昂贵的函数,它仅在满足某些条件时提供相关数据。该数据通过 LEFT JOIN LATERAL 插入到结果中,如下所示。现在,该函数会为每一行调用。
有没有办法重写它,以便仅对 t1.type 等于 5 的行调用它?尽管我设置了条件,但下面仍然为每一行调用该函数。
SELECT t1.name, t1.type, t2.col1, t2.col2
FROM table1 t1
LEFT JOIN LATERAL function_name(t1.col1, t1.col2) AS t2 ON t1.type = 5;
测试用例:
CREATE TABLE table1 (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
type INTEGER,
col1 INTEGER,
col2 INTEGER
);
-- Sample data for table1
INSERT INTO table1 (name, type, col1, col2)
VALUES
('Row 1', 5, 10, 20),
('Row 2', 7, 15, 25),
('Row 3', 10, 30, 40);
CREATE OR REPLACE FUNCTION function_name(col1_arg INTEGER, col2_arg INTEGER)
RETURNS TABLE (col1 INTEGER, col2 INTEGER)
AS $$
BEGIN
RAISE LOG 'Function called';
RETURN QUERY SELECT col1_arg * 2 AS col1, col2_arg * 3 AS col2;
END;
$$ LANGUAGE plpgsql;
-- Test Query
SELECT t1.name, t1.type, t2.col1, t2.col2
FROM table1 t1
LEFT JOIN LATERAL function_name(t1.col1, t1.col2) AS t2 ON t1.type = 5;
小提琴
测试类似的东西:
尝试#1:将条件放入 WHERE 子句中有效,但它会更改查询结果,因为它将删除 type!=5 的所有行:
...但是您可以将行放回:
如果“table1”不是表而是复杂的查询,您可以将其放入物化 CTE 中以避免执行两次。
尝试#2:将“RETURNS NULL ON NULL INPUT”添加到函数中,并在您实际上不想调用它时使用空值来调用它,这不会执行该函数,这要快得多:
(当您不想调用函数时,也可以使用 CASE 将函数的所有参数设置为 NULL)。
尝试#3
这似乎工作正常,函数仅在应该调用时才被调用。
尝试#4:
这也很好用。