如何在 Postgres 函数中进行条件查询
How to make a conditional query in Postgres function
我从 Postgress 开始,我需要用四个 id 作为参数进行查询,这些可以是 NULL,只有第一个是强制性的,所以我试图获得一个包含每个数据的数据列表ID。如何在 WHERE 条件下检查 id 参数是否为 NOT NULL。
我给你举个例子(没用)
CREATE OR REPLACE FUNCTION sp_lock(
IN p_id_1 character varying,
IN p_id_2 character varying DEFAULT NULL,
IN p_id_3 character varying DEFAULT NULL,
IN p_id_4 character varying DEFAULT NULL)
RETURNS SETOF character varying AS
$BODY$
BEGIN
UPDATE stock
SET lock = 1
FROM (
SELECT s.id
FROM stock s
WHERE
(ls.id = p_id_1 or p_id_1 is null) OR
(ls.id = p_id_2 or p_id_2 is null) OR
(ls.id = p_id_3 or p_id_3 is null) OR
(ls.id = p_id_4 or p_id_4 is null) AND
ls.lock = 0
FOR UPDATE OF s
) i
WHERE i.id = stock.id;
这里我需要先检查参数是否为 NOT NULL,然后用 OR exp 连接到条件。
您可以在 where 条件
中使用 in
operator
WHERE
s.id in (p_id_1, p_id_2, p_id_3, p_id_4) AND
s.lock = 0;
顺便说一句,您不需要子查询:
UPDATE stock
SET lock = 1
WHERE
id in (p_id_1, p_id_2, p_id_3, p_id_4) AND
lock = 0;
完全相同但速度更快。
我从 Postgress 开始,我需要用四个 id 作为参数进行查询,这些可以是 NULL,只有第一个是强制性的,所以我试图获得一个包含每个数据的数据列表ID。如何在 WHERE 条件下检查 id 参数是否为 NOT NULL。 我给你举个例子(没用)
CREATE OR REPLACE FUNCTION sp_lock(
IN p_id_1 character varying,
IN p_id_2 character varying DEFAULT NULL,
IN p_id_3 character varying DEFAULT NULL,
IN p_id_4 character varying DEFAULT NULL)
RETURNS SETOF character varying AS
$BODY$
BEGIN
UPDATE stock
SET lock = 1
FROM (
SELECT s.id
FROM stock s
WHERE
(ls.id = p_id_1 or p_id_1 is null) OR
(ls.id = p_id_2 or p_id_2 is null) OR
(ls.id = p_id_3 or p_id_3 is null) OR
(ls.id = p_id_4 or p_id_4 is null) AND
ls.lock = 0
FOR UPDATE OF s
) i
WHERE i.id = stock.id;
这里我需要先检查参数是否为 NOT NULL,然后用 OR exp 连接到条件。
您可以在 where 条件
中使用in
operator
WHERE
s.id in (p_id_1, p_id_2, p_id_3, p_id_4) AND
s.lock = 0;
顺便说一句,您不需要子查询:
UPDATE stock
SET lock = 1
WHERE
id in (p_id_1, p_id_2, p_id_3, p_id_4) AND
lock = 0;
完全相同但速度更快。