在 Postgres 函数中引用参数

Aar*_*ron 5 sql postgresql

该表org有一列名为npi。为什么query1有效而不query2有效?

查询 1 -

CREATE OR REPLACE FUNCTION check (npi TEXT)
RETURNS BOOLEAN AS $$

DECLARE
   pass_npi TEXT;

BEGIN
   pass_npi := npi;

   SELECT 1
   FROM org doc
   WHERE doc.npi = pass_npi
   ;

   RETURN 1;

END $$
Run Code Online (Sandbox Code Playgroud)

查询 2 -

CREATE OR REPLACE FUNCTION check (npi TEXT)
RETURNS BOOLEAN AS $$

BEGIN

   SELECT 1
   FROM org doc
   WHERE doc.npi = npi
   ;

   RETURN 1;

END $$
Run Code Online (Sandbox Code Playgroud)

错误 -

Ambigious column name NPI

Lau*_*lbe 7

因为在第二种情况下,不清楚是npi表列(这将是有效的,但无用的语句)还是函数参数。

除了第一个查询中的解决方案之外,还有三种解决方案:

  1. 最好的一种:使用名称与表列不同的函数参数。这可以通过使用前缀来完成:

    CREATE FUNCTION check (p_npi TEXT) RETURNS boolean AS
       ...
       SELECT ...
       WHERE doc.npi = p_npi
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用ALIAS命令“重命名”参数:

    CREATE FUNCTION check (npi TEXT) RETURNS boolean AS
    $$DECLARE
       p_npi ALIAS FOR npi;
    BEGIN
       ...
       SELECT ...
       WHERE doc.npi = p_npi
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用函数名称限定参数:

    CREATE FUNCTION check (npi TEXT) RETURNS boolean AS
       ...
       SELECT ...
       WHERE doc.npi = check.npi
    
    Run Code Online (Sandbox Code Playgroud)