2016-07-05 2 views
1

versucht, wie etwas zu tun:Gibt es eine Möglichkeit, eine benannte Konstante/Parameter in einer SQL-Abfrage mit einer einzigen Anweisung zu definieren?

WITH 
dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT * FROM my_table WHERE start_date >= dates.start AND end_date <= dates.end 

aber bekam die Fehlermeldung "Relation 'Daten' existiert nicht" (in Vertica). Gibt es einen geeigneten Weg, um eine Konstante/einen Parameter zu definieren? In einem realen Beispiel enthält die Abfrage mehrere Selects über einen definierten Zeitraum. Daher möchte ich die Werte constants/parameters an einer einzigen Stelle beibehalten, damit sie in den verschachtelten Unterabfragen wiederverwendet werden können.

Wenn möglich, möchte ich auf DECLARE/SET-ähnliche Anweisungen verzichten, bei denen eine separate Zeile erforderlich ist.

+1

Warum wird sowohl Vertica als auch MySQL getaggt? Dies sind sehr unterschiedliche Datenbanken. Ich habe das MySQL-Tag entfernt, weil Ihre Frage darauf hindeutet, dass 'WITH' funktioniert und von MySQL nicht unterstützt wird. –

+0

Mir war nicht bekannt, dass MySQL 'WITH' nicht unterstützt und ich habe MySQL wegen des StackOverflow-Vorschlags hinzugefügt. Danke für die Korrekturen, @GordonLinoff – BreakPhreak

+0

Welchen Client verwenden Sie, um eine Verbindung herzustellen? Sind diese vsql-Skripte? – woot

Antwort

1

Sie müssen dates in der FROM Klausel haben, wenn Sie es in der Abfrage möchten. Sie können dies tun, wie:

WITH dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT t.* 
FROM my_table t JOIN 
    dates d 
    ON t.start_date >= d.start AND t.end_date <= d.end; 

Hinweis: Sie können dies auch mit einem CROSS JOIN. Ich schreibe oft Anfragen wie:

WITH params as (
    SELECT '2015-01-01' as start, '2016-01-01' as end 
    ) 
SELECT t.* 
FROM params CROSS JOIN 
    my_table t 
WHERE t.start_date >= params.start AND t.end_date <= params.end; 
+0

Also eine Konstante kommt zu einem 'JOIN' Preis, richtig? Das macht den Code noch weniger lesbar, da es viele Auswahlmöglichkeiten in Unterabfragen gibt :( – BreakPhreak

2

würde ich noch tun, was erwähnt @GordonLinoff (ich bezweifle es viel Einfluss auf die Abfrage-Plan hat), aber falls Sie wirklich nicht wollen, oder wie die Funktion werde ich am ende zeigen ...

Sie haben erwähnt, dass Sie vsql verwenden würden. Sie können dort Variablen ausführen.

\set start '2015-01-01' 
\set end '2016-01-01' 
SELECT * 
FROM my_table 
WHERE start_date >= :start 
AND end_date <= :end; 

Was ich irgendwie schön erraten ist, weil Sie auch, wie die Dinge tun können:

\set start ''`date "+%Y-%m-%d %H:%M:%S"`'' 

oder Echo das Ergebnis eines Befehls in eine Variable, die Sie als Variable in der SQL-Anweisung verwenden . Beachten Sie, dass diese Variable ziemlich wörtlich ist und dass Sie alle Interpunktionen, Zitate usw. einfügen müssen. Es ist nicht nur ein Wert, sondern eher eine Vorlage.

Verwandte Themen