Endfe

2016-03-24 7 views
0

için gerek olmadan başka bir sözdizimi var mı? Sorunum (aşağıdaki) oldu. Eğer endeks olmadan başka bir deyim kullanıyorum ve MySQL her zaman bana sözdizimi hatası verdi. if-else ifadesinin bittiğini belirtmek için sistemi yazılı olarak bildirmek zorunda olduğunuz kavramdan hoşlanmıyorsunuz. Eğer biti kullanmadan aynı kodu yerine getirmenin başka bir yolu var mı? Bence iki ayrı yazı yazmayı düşünüyordum. if-else yerine kullanmak yerine hala bir sözdizimi hatası vardı.Endfe

if max_helper>(cur_budget + check_budget_sp.salary) then 
    set res="F"; 
else 
    set res="T";    
end if; 

olabilir:

Düzenleme:

+4

, bir sözdizimi var. Maalesef, hoşuna gitmiyorsa yapabileceğiniz fazla bir şey yok. – Loufylouf

+0

"ELSE" isteğe bağlıdır. 'THEN' ve' END IF' zorunludur. problem değil. Prosedürün çalıştığından emin misin? "Max_helper" ve "cur_budget" olarak adlandırılmayan yordam değişkenlerine başvurular var. Ve bir SQL deyiminde prosedürün adı ile nitelendirilmiş yordam argümanlarını hiç görmedim. Bu MySQL sözdizimine benziyor, ancak bu kodun aslında nasıl çalıştığına dair şaşkınım. – spencer7593

cevap

1

Evet, bir IF ifadesini kullanarak alternatifler vardır: yerine. Örnek olarak

:
CREATE PROCEDURE check_budget_sp(IN in_department_name VARCHAR(20) 
    ,IN in_salary DECIMAL(8,2),OUT res VARCHAR(1)) 
BEGIN 
    SET res = 'T'; 
    SELECT CASE WHEN d.max_budget>(d.cur_budget + in_salary) THEN 'F' ELSE 'T' END 
    INTO res 
    FROM department d 
    WHERE d.dept_name = in_department_name 
    LIMIT 1; 
END$$ 

SEÇ bir satır dönmezse

, MySQL bir uyarı mesajı atmak için gidiyor. (OP prosedür deseni aynı davranışı sergileyecektir.) Bir uyarıdan kaçınmak istiyorsak bunu kolayca yapabilirdik, ancak bazı ek kodlar gerektirirdi.

hiçbir satır sorgu tarafından döndürülen durumunda OP prosedüründe then 'F' else 'T' mantığı, taklit etmek için, biz sadece biz sorgu işlemini gerçekleştirmeden önce, else tarafından iade edileceği değere dönüş değerini başlatılamadı.

Bu uygulama, herhangi bir ekstra "yardımcı" yordam değişkenini gerektirmez. Ve fazladan SET bildirimi, prosedürün bir 'T' veya 'F' (sorguyu bir satır döndürmediğinde) döndürdüğünden emin olmak için oradadır. Diğer birkaç alternatif var. MySQL IF deyimi için


, THEN ve END IF zorunludur. ELSE isteğe bağlıdır.

Bu gerçekten sorun değil.

Eğer ENDCASE ifadesinin parçası olarak gerekli, bir MySQL özgü fonksiyonlu, CASE ifadeyi değiştirmek olabilir beğenmezseniz ... Bu bir kavram değil

  IF(d.max_budget>(d.cur_budget + in_salary),'F','T') 
+0

cevabını değiştirdim Bu gerçekten çok iyi – Curriculaa

+0

Sorgu birden fazla satır döndürürse, MySQL yalnızca bir uyarı (yalnızca bir uyarı) atmaz. Birden fazla satır döndürmeyeceğini garanti etmek için sorguya 'LIMIT 1 'ekledim. (Muhtemelen, 'dept_name'ın 'departman' tablosunda benzersiz olması beklenmektedir.Bir garanti, LİMİT'i dahil ediyorum.Ben de deterministik sonuca ulaşmak için bir“ ORDER BY ”cümlesi ekleyeyim, ama ben prosedürü başka bir satırla karıştırmamak için atladı. – spencer7593

0

Bu kod eğer başka ucun biçimini değiştirmek için bazı users.The temel soru için soru daha karmaşık hale beri kodu silindi oldu

set res = if(max_helper > cur_budget + check_budget_sp.salary, 'F', 'T'); 
+0

Bildirilen "max_helper" veya "cur_budget" değişkenlerini göremiyorum. Bir prosedür argümanını prosedürün ismiyle nitelendirmek geçerli midir?(Belki kafam karıştı, ama bunun nasıl derleneceğini ya da çalışacağını göremiyorum.) – spencer7593

+0

@ spencer7593 Çalışmayla ilgili hiçbir iddiada bulunmadım. Ben sadece soruların gereksinimlerini karşıladığını sorulan parçaya bir alternatif önerdim – Bohemian

+0

Cevabınız çok daha güzel görünüyor ama bir soru. Max_helper toplamından daha büyük olduğunda "T" sonucunu veren bir durumdur. Çünkü kodumda olması gerekir. "F" – Curriculaa