2015-09-25 67 views
1

我以Postgress开始,我需要以四个ID作为参数进行查询,这些可以是NULL,只有第一个是必需的,所以我试图获得一个包含每个id数据的数据列表。我如何检查id参数是否在WHERE条件内不为NULL。 我给你一个例子(没有工作)如何在Postgres函数中进行条件查询

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,然后拼接的条件,用或EXP。

+0

这个查询究竟有什么问题? – Mureinik

+0

我不确定如果p_id_3为空,会发生什么,例如,只能确保p_id_1总是会来。 –

回答

1

你可以使用in operator在where条件

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; 

不完全一样,但速度更快。