Unterstützt PostgreSQL berechnete / berechnete Spalten wie MS SQL Server? Ich kann nichts in den Dokumenten finden, aber da diese Funktion in vielen anderen DBMS enthalten ist, dachte ich, dass mir möglicherweise etwas fehlt.
Beispiel: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
quelle
quelle
Antworten:
Bis zu Postgres 11 generierte Spalten werden nicht unterstützt - wie im SQL-Standard definiert und von einigen RDBMS implementiert, einschließlich DB2, MySQL und Oracle. Auch nicht die ähnlichen "berechneten Spalten" von SQL Server.
STORED
generierte Spalten werden mit Postgres 12 eingeführt . Triviales Beispiel:db <> hier fummeln
VIRTUAL
Generierte Spalten können mit einer der nächsten Iterationen kommen. (Noch nicht in Postgres 13).Verbunden:
Bis dahin können Sie
VIRTUAL
generierte Spalten mit einer Funktion unter Verwendung der Attributnotation (tbl.col
) emulieren, die einer virtuell generierten Spalte ähnelt und funktioniert . Das ist eine Seltsamkeit der Syntax, die in Postgres aus historischen Gründen existiert und zufällig zum Fall passt. Diese verwandte Antwort enthält Codebeispiele :Der Ausdruck (sieht aus wie eine Spalte) ist jedoch nicht in a enthalten
SELECT * FROM tbl
. Sie müssen es immer explizit auflisten.Kann auch mit einem passenden Ausdrucksindex unterstützt werden - vorausgesetzt, die Funktion ist
IMMUTABLE
. Mögen:Alternativen
Alternativ können Sie ähnliche Funktionen mit a implementieren
VIEW
, optional gekoppelt mit Ausdrucksindizes. DannSELECT *
kann die generierte Spalte enthalten sein."Persisted" (
STORED
) berechnete Spalten können mit Triggern auf funktional identische Weise implementiert werden.Materialisierte Ansichten sind ein eng verwandtes Konzept, das seit Postgres 9.3 implementiert wurde .
In früheren Versionen können MVs manuell verwaltet werden.
quelle
Ja, du kannst!! Die Lösung sollte einfach, sicher und performant sein ...
Ich bin neu in postgresql, aber es scheint, dass Sie berechnete Spalten mithilfe eines Ausdrucksindex erstellen können, der mit einer Ansicht gepaart ist (die Ansicht ist optional, erleichtert aber das Leben ein wenig).
Angenommen, meine Berechnung lautet
md5(some_string_field)
, dann erstelle ich den Index wie folgt :Bei allen Abfragen, die bearbeitet werden,
MD5(some_string_field)
wird der Index verwendet, anstatt ihn von Grund auf neu zu berechnen. Beispielsweise:Sie können dies mit EXPLAIN überprüfen .
An diesem Punkt verlassen Sie sich jedoch darauf, dass Benutzer der Tabelle genau wissen, wie die Spalte erstellt wird. Um das Leben zu vereinfachen, können Sie
VIEW
eine erweiterte Version der Originaltabelle erstellen und den berechneten Wert als neue Spalte hinzufügen:Jetzt können alle verwendeten Abfragen verwendet
some_table_augmented
werden,some_string_field_md5
ohne sich Gedanken darüber zu machen, wie es funktioniert. Sie erhalten nur eine gute Leistung. Die Ansicht kopiert keine Daten aus der Originaltabelle, ist also sowohl speicher- als auch leistungsmäßig gut. Beachten Sie jedoch, dass Sie nicht in eine Ansicht aktualisieren / einfügen können, sondern nur in die Quelltabelle. Wenn Sie dies jedoch wirklich möchten, können Sie Einfügungen und Aktualisierungen mithilfe von Regeln in die Quelltabelle umleiten (in diesem letzten Punkt könnte ich mich irren) Ich habe es selbst nie versucht.Bearbeiten: Wenn die Abfrage konkurrierende Indizes umfasst, verwendet die Planer-Engine den Ausdrucksindex manchmal überhaupt nicht. Die Wahl scheint datenabhängig zu sein.
quelle
if the query involves competing indices
?Eine Möglichkeit, dies zu tun, ist mit einem Auslöser!
Der Trigger wird ausgelöst, bevor die Zeile aktualisiert oder eingefügt wird. Es ändert das Feld, das wir für den
NEW
Datensatz berechnen möchten, und gibt dann diesen Datensatz zurück.quelle
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
und es ist gerade zurückgekehrt: 1 2 und 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
der Wert dertwo
Spalte wird automatisch berechnet!PostgreSQL 12 unterstützt generierte Spalten:
db <> Geigen-Demo
quelle
Ich bin mir nicht sicher, ob Sie das meinen, aber Posgres unterstützt normalerweise die "Dummy" -ETL-Syntax. Ich habe eine leere Spalte in der Tabelle erstellt und musste sie dann mit berechneten Datensätzen füllen, abhängig von den Werten in der Zeile.
quelle
Ich habe einen Code, der funktioniert und den berechneten Begriff verwendet. Ich bin nicht auf PostgresSQL rein, obwohl wir auf PADB laufen
Hier ist, wie es verwendet wird
quelle
Eine leichte Lösung mit Check-Einschränkung:
quelle
field as 1 persisted
.