2017-11-25 206 views
1

有沒有辦法在普通PL/pgSQL中匹配實體? 比方說,我想通過使用比較三個單屬性的文本搜索查詢來識別匹配搜索一個人在客戶表:通過屬性匹配兩個表的行

SELECT id, first_name, last_name, birthdate 
    FROM customers_index 
    WHERE first_name @@ plainto_tsquery('simple','John') 
     AND last_name @@ plainto_tsquery('simple','Smith') 
     AND birthdate = '17.08.1967'; 

但這樣做對每個人是有點乏味,因爲我有一整張我想要以這種方式匹配的人。在任何「正常編程語言」的幫助下,我現在循環一個數組,直到我發現每一行的現有匹配成爲一個新表,但有沒有辦法在普通的PL/pgSQL中執行此操作?

回答

1

我想在PL/PGSQL與陣列相結合作爲輸入參數,將很好地工作的功能(類似於Oracle的PL/SQL):

CREATE OR REPLACE FUNCTION customers(first_names text[], last_names text[], 
    birthdays date[]) 
    RETURNS SETOF customers_index as 
$BODY$ 
DECLARE 
    i integer; 
    elements integer; 
    rw customers_index%rowtype; 
BEGIN 

    elements := array_length (first_names); 

    for i in 1..elements loop 

    for rw in SELECT ci.* 
     FROM customers_index ci 
     WHERE ci.first_name @@ plainto_tsquery('simple', first_names[i]) 
     AND ci.last_name @@ plainto_tsquery('simple', last_names[i]) 
     AND ci.birthdate = birthdays[i] 
    loop 
     return next rw; 
    end loop; 
    end loop; 

    return; 

END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

和實施將是這個樣子:

select 
    id, first_name, last_name, birthdate 
from 
    customers(array['John', 'Jane'], array['Smith', 'Doe'], 
     array ['17.08.1967', '16.07.1970']) 

如果當然,假設你的數據來自其他地方,實際的實現應該看起來更清潔。

另外,我不保證這是超高效的,但它是從A到B的快速路徑,並且有一些GIN索引,或者至少是生日的索引,它可能實際上運行得很漂亮很好。

+0

謝謝,我可以根據您的建議創建一個工作解決方案。只是一個小問題:array_length()需要兩個參數,所以array_length(first_names,1)做了這個工作。由於沒有人提供解決方案,我會將您的解決方案標記爲最佳答案。 – MayaK

相關問題