Ссылка на параметр в функции Postgres - PullRequest
2 голосов
/ 24 апреля 2020

В таблице 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 $$

Запрос 2 -

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

BEGIN

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

   RETURN 1;

END $$

ОШИБКА -

Ambigious column name NPI

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Поскольку во втором случае неясно, является ли npi столбцом таблицы (это будет действительный, если бесполезный оператор) или параметром функции.

Существует три решения, кроме одного в Ваш первый запрос:

  1. Лучший: используйте параметры функций, имена которых отличаются от столбцов таблицы. Это можно сделать с помощью префикса:

    CREATE FUNCTION check (p_npi TEXT) RETURNS boolean AS
       ...
       SELECT ...
       WHERE doc.npi = p_npi
    
  2. . Используйте команду ALIAS для «переименования» параметра:

    CREATE FUNCTION check (npi TEXT) RETURNS boolean AS
    $$DECLARE
       p_npi ALIAS FOR npi;
    BEGIN
       ...
       SELECT ...
       WHERE doc.npi = p_npi
    
  3. Укажите в параметре имя функции:

    CREATE FUNCTION check (npi TEXT) RETURNS boolean AS
       ...
       SELECT ...
       WHERE doc.npi = check.npi
    
0 голосов
/ 24 апреля 2020

В результате в Query2 вы сравниваете поле do c .npi с ним, то же самое, что сказать do c .npi и npi, по этой причине оно показывает, что предложение неоднозначно, напротив, в Query1 вы сравниваете поле do c .npi с другим полем pass_npi.

Чтобы решить эту проблему, вы должны сравнить те же столбцы, но из разных таблиц. или разные столбцы из одной таблицы.

Запрос2:

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

            BEGIN

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

               RETURN 1;

            END $$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...