2011-08-05 13 views
5

Wiele języków programowania nowoczesnych mieć zwarciem logiczną ocenę takich jak:Czy nowoczesne DBMS uwzględniają ocenę Boolean zwarcia?

if (x() OR y()) 

If x() zwraca true, y() nigdy nie jest oceniana.

Czy SQL na współczesnym DBMS (SQL Server, Sybase, Oracle, DB2 itp.) Ma tę właściwość?

W szczególności, jeśli lewa strona instrukcji boolowskiej jest stałą logiczną, czy zostanie zwarta?


pokrewne: Do all programming languages have boolean short-circuit evaluation?

Odpowiedz

1

Tak i nie.

(poniżej odnosi się do SQL Server wyłącznie)

Niektórzy operatorzy zwarcie, a niektóre nie. ORCAN zwarcie, ale może nie w zależności od kolejności operacji wybranych przez silnik zapytania.

CASE to (jak sądzę) 100% gwarancji na zwarcie.

Można także spróbować wymusić kolejność oceny z zagnieżdżonych nawiasów, jak:

IF ((X) OR Y)

Ale nie jestem pozytywne jest zawsze zgodny albo.

Kłopot z SQL w tym zakresie jest deklaratywny, a rzeczywistą logikę wykonuje silnik. W rzeczywistości może być skuteczniejsze sprawdzanie najpierw pod kątem przykładu od Y, a następnie sprawdzanie pod kątem X - jeśli na przykład Y jest indeksowany, a X wymaga skanowania tabeli.

dla odniesienia:

Z dokumentacji ANSI SQL from this answer:

Jeżeli pierwszeństwo nie jest określany przez formaty lub nawiasach, skuteczna ocena wyrażeń jest ogólnie wykonywane od lewej w prawo. Jednak jest zależna od implementacji czy wyrażenia są faktycznie oceniano lewej do prawej, szczególnie gdy operandy lub operatorzy mogą spowodować warunki, aby zostać podniesiona czy wyniki wyrażeń można określić bez całkowitego oceny wszystkich częściach wyrażenie.

+0

sprawa nie jest w SQL, więc nie jestem pewien, jak to ma zastosowanie. (Jest w t-sql) –

+0

@Billy - punkt dobry, dodałem zastrzeżenie na początku odpowiedzi. – JNK

+0

+1 dla odniesienia do dokumentacji –

1

Mówiąc konkretnie o SQL Server - sort.

Porządek, w którym określasz swoje instrukcje OR, nie może zagwarantować zwarcia, ponieważ optymalizator może je ponownie zamówić w-woli, jeśli czuje się lepszy wzrost wydajności może być dokonany w ten sposób.

Jednak sam silnik może ulec zwarciu. To tylko coś, czego użytkownik nie może kontrolować.

Poniższy artykuł (który łączy do innych doskonałych dyskusje/zasobów) ma więcej na ten temat: http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx

+1

Dotyczy to również PostgreSQL [http://www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL] z tych samych powodów. – SingleNegationElimination

Powiązane problemy