sql >> Databáze >  >> RDS >> PostgreSQL

Je možné v postgreSQL použít proměnnou a nespecifikovat návratový typ?

Blok anonymního kódu (DO příkaz) nemůže vrátit řádky a Postgres nemá žádné globální proměnné. Existuje jen málo způsobů, jak bez něj žít. Čtyři z nich jsou následující.

Použijte společný tabulkový výraz (WITH příkaz)

WITH def AS (
    SELECT 3 AS colorid
    )
SELECT *, substring(name,1,3) 
FROM products
JOIN def
USING (colorid);

Použijte dočasnou tabulku pro proměnné:

CREATE TEMP TABLE var(colorid int);
INSERT INTO var values (3);
SELECT *, substring(name,1,3) 
FROM products
JOIN var
USING (colorid);
DROP TABLE var;

Pro výsledky použijte dočasnou tabulku:

DO $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    CREATE TEMP TABLE res AS 
        SELECT *, substring(name,1,3) 
        FROM products
        WHERE colorid = v_colorid;
END $$;
SELECT * 
FROM res;
DROP TABLE res;

Vytvořte funkci (příklad):

CREATE OR REPLACE FUNCTION select_from_products()
RETURNS TABLE (colorid int, name text, abbr text)
LANGUAGE plpgsql as $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    RETURN QUERY
        SELECT *, substring(p.name,1,3) 
        FROM products p
        WHERE p.colorid = v_colorid;
END $$;

SELECT * FROM select_from_products();



  1. 7 způsobů, jak najít duplicitní řádky v PostgreSQL při ignorování primárního klíče

  2. Je SELECT nebo INSERT ve funkci náchylný k závodům?

  3. Chyby v SQL Serveru při importu souboru CSV navzdory použití varchar(MAX) pro každý sloupec

  4. Příkaz T-SQL Stuff