PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да върна стойност от функция, ако не е намерена стойност

Обяснение

Коренът на проблема е размитата дефиниция на „нищо“.

NULL не е нищо , само не се знае какво точно е. „Нищо“ от гледна точка на SQL би било няма ред :не се връща нищо. Това обикновено се случва, когато не е намерен ред. Но когато използвате агрегирани функции , това не може да се случи, защото по документация:

avg() връща NULL когато не са намерени редове (така че не "нищо"). Получавате ред с NULL стойност като резултат - която заменя вашата начална стойност в кода, който демонстрирате.

Решение

Обвийте резултата в COALESCE . Демонстриране на много по-проста SQL функция:

CREATE OR REPLACE FUNCTION get_height_sql(firstn varchar, lastn varchar)
  RETURNS float AS
$func$
   SELECT COALESCE(AVG(((p.h_feet * 12) + p.h_inches) * 2.54)::float, 0)
   FROM   player p
   WHERE  p.firstname = firstn
   AND    p.lastname = lastn
$func$  LANGUAGE sql STABLE;

SQL Fiddle.

Същото може да се използва във функция plpgsql. Тази функция може да бъде STABLE , може да помогне с производителността в контекста на по-големи заявки.

Други случаи

Ако наистина можете вземете без ред от заявка, просто COALESCE ще се провали , защото никога не се изпълнява.

За единствена стойност в резултат можете просто да обвиете цялата заявка като:

SELECT COALESCE((SELECT some_float FROM ... WHERE ... LIMIT 1), 0) AS result

PL/pgSQL има способността да проверява, преди действително да се върне от функцията. Това работи за няколко реда с една или повече колони , също. Има пример в ръководството демонстриране на използването на FOUND :

...
RETURN QUERY SELECT foo, bar ...;

IF NOT FOUND THEN
    RETURN QUERY VALUES ('foo_default'::text, 'bar_default'::text);
END IF;
...

Свързани:

Винаги да връщате точно един ред , можете също да използвате чист SQL :

SELECT foo, bar FROM tbl
UNION ALL
SELECT 'foo_default', 'bar_default'
LIMIT 1;

Ако първият SELECT не връща ред, вторият SELECT връща ред със стойности по подразбиране.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо не мога да правя заявки директно на jsonb_array_elements?

  2. Postgres намира конфигурационни файлове в linux

  3. PostgreSQL не може да започва/прекратява транзакции в PL/pgSQL

  4. разлика между localhost и postgres за хост в docker

  5. Попълване на множество таблици от един JSON обект с json_populate_recordset