Donnerstag, Juli 03, 2014

Multi-Attribut-Vergleiche

Ein interessanter Hinweis von Jonathan Lewis, der auf eine Präsentation von Markus Winand bei den Trivadis CBO-Tagen zurückgeht (die ich mir auch gern angeschaut hätte, wenn ich mir dergleichen leisten könnte): in manchen RDBMS ist es möglich, mehrspaltige Vergleiche der folgenden Form durchzuführen:

where (col1, col2) < (const1, const2)

Die Logik dabei ist: das Prädikat liefert TRUE, wenn col1 < const1 ist, oder wenn gilt: col1 = const1, aber col2 < const2 (und NULL-Werte machen vermutlich den üblichen Ärger). Im Oracle-Fall gibt es eine solche Logik nur intern bei der Auswertung von multi column range partitioning, aber nicht in SQL Queries. Nach Lektüre des Artikels habe ich mir die Frage gestellt, was postgres von diesem Konstrukt hält:

with
basedata as (
select 1 col1, 2 col2, 1 col3, 3 col4
)
select * from basedata where (col1, col2) < (col3, col4);

 col1 | col2 | col3 | col4
------+------+------+------
    1 |    2 |    1 |    3
(1 Zeile)

with
basedata as (
select 1 col1, 2 col2, 1 col3, 3 col4
)
select * from basedata where (col1, col2) > (col3, col4);

 col1 | col2 | col3 | col4
------+------+------+------
(0 Zeilen)

Funktioniert also wie beschrieben. Obwohl ich den Eindruck habe, dass die RDBMS-Dialekte eine gewisse Tendenz zur Vereinheitlichung zeigen, gibt's doch immer wieder interessante Detail-Unterschiede.

2 Kommentare:

  1. Hallo Thomas,
    hatte Deinen Kommentar ganz übersehen (bzw. auf anderem Kommunikationsweg erwartet...).
    Danke.

    AntwortenLöschen