2010-09-14 19 views
5

İkinci bir tablo verilerini sorgulamak gerekiyor, ancak birincil tablodaki koşulları nadir kümesi karşılandığında yalnızca:MySQL Kısa Devresi IF() işlevi var mı?

SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM tablea ... 

a, b ve c koşulları hemen hemen her zaman yanlış, bu yüzden benim düşünce olduğunu alt sorgu asla sonuç kümesindeki çoğu satır için çalışmayacak ve böylece bir birleşimden çok daha hızlı olacaktır. Ancak bu sadece IF() ifadesi kısa devrelerse doğrudur.

Öyle mi?

Sağladığınız her türlü yardım için teşekkürler.

cevap

2

Ben kendi test case ile geldi. Onun örneği, durum değerlendirmesinde kısa devre yapmayı denemiyor, ama fikrini kullanarak MySQL'in gerçekten de IF() koşul kontrolünü kısa devre yaptığını doğruladım.

İkinci örnekte On
SET @var:=5; 
SELECT IF(1 = 0 AND (@var:=10), 123, @var); #Expected output: 5 
SELECT IF(1 = 1 AND (@var:=10), @var, 123); #Expected output: 10 

, MySQL düzgün kısa devre geçerli: @var yardım J. Jorgenson için 10

için

Teşekkür set geçmez!

0

SQL çözümleyicide deneyin. Güvenli tarafta olmak ve veritabanına güvenmek zorunda kalmamak için tek bir yolla çalışmak (ve bu davranışı yeni sürümlerde değiştirmemek), sadece iki sorgu yapın ve IF'yi programatik olarak yapın.

8

Yanıt YES.
Bir mysql sorgusu içindeki IF (cond, expr_true, expr_false) kısa devre yaptı. gerçeğini kanıtlamak için @variables kullanarak Burada bir test

: Sonuç her üç SEÇ sorgulardan '5'
SET @var:=5; 
SELECT IF(1 = 0, (@var:[email protected] + 1), @var); -- using ':=' operator to modify 'true' expr @var 
SELECT IF(1 = 1, @var, (@var:[email protected] + 1)); -- using ':=' operator to modify 'false' expr @var 
SELECT @var; 

olduğunu

.

IF() işlevi kısa devre yaptırmamışsa, sonuç SELECT # 1'den '5' ve SELECT # 2'den '6' ve son 'select @var'dan' 7 'olur. Bu, 'true' ifadesinin NEVER yürütüldüğü, # 1 seçiminde yürütüldüğü ve # 2 seçimi için çalıştırılan yanlış ifade olmadığı için ortaya çıkar.

': =' işleci, bir SQL sorgusunda bir @var'ı değiştirmek için kullanılır (select, from, ve where cümleleri). Bundan gerçekten çok hoş/karmaşık bir SQL alabilirsiniz. Bir SQL sorgusunda 'prosedürel' mantığını uygulamak için @vars kullandım.

- J Jorgenson - J. Jorgenson yardımıyla

0

Bu, bağlıdır.

EĞER bunun örneğin, GROUP_CONCAT ile kesme uyarıları önlemek için kullanılabileceğini kısa devre böyle yapar: 'gerçek sonuç' olacak

set @@group_concat_max_len = 5; 

select if(true or @var:=group_concat('warns if evaluated'), 'actual result', @var); 

sonuç ama bir uyarı alırsınız :

böyle ayrı anahtarlar gibi daha az önemsiz GROUP_CONCAT ifadeleri ile olsun aynı uyarıyı olduğunu ve hiç IF olmadan
Warning (Code 1260): Row 1 was cut by GROUP_CONCAT() 

.