sql >> Database teknologi >  >> RDS >> PostgreSQL

Markørbaserede poster i PostgreSQL

1. Implicit markør

Det er næsten altid bedre at bruge den implicitte markør af en FOR sløjfe end at ty til en noget langsommere og uhåndterlig eksplicit markør. Jeg har skrevet tusindvis af plpgsql-funktioner, og kun en hånd fuld af gange med eksplicitte markører gav mening.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
      SELECT *
      FROM   address ad
      JOIN   city    ct USING (city_id)
   LOOP
      IF rec.city LIKE '%hi%' THEN
          RETURN NEXT rec.city;               
      END IF;
   END LOOP;
END
$func$  LANGUAGE plpgsql STABLE;

Bortset fra:der er intet i funktionen, der kræver volatilitet VOLATILE . Brug STABLE .

2. Set-baseret tilgang

Det er næsten altid bedre at bruge en sæt-baseret tilgang hvis det er muligt . Brug RETURN QUERY for at returnere som sæt fra en forespørgsel direkte.

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
BEGIN   
   RETURN QUERY
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
END
$func$  LANGUAGE plpgsql STABLE;

3. SQL-funktion

Til det simple tilfælde (sandsynligvis en forenkling), kan du også bruge en simpel SQL-funktion eller endda bare forespørgslen:

CREATE OR REPLACE FUNCTION avoidable_states()
  RETURNS SETOF varchar AS
$func$
   SELECT ct.city
   FROM   address ad
   JOIN   city    ct USING (city_id)
   WHERE  ct.city LIKE '%hi%';
$func$  LANGUAGE sql STABLE;


  1. Hvordan kan jeg matche de sidste to ord i en sætning i PostgreSQL?

  2. MySQL PHP-inkompatibilitet

  3. Prisma relationer

  4. Hvordan COS() virker i MariaDB