2016-03-20 15 views
1

nvl2 kullanmam gerektiğinden emin değil, ama bana mantıklı geliyor. Seçimi işe alabilseydim. Aşağıdaki veriler gerçek değil, hayal ettiğim nesnelerle alabildiğim kadar yakın:Oracle sql 11g - Bir nvl2 işlevi select deyimini içerebilir mi?

Bunu iki tablo ve bir görünüm halinde yayınlamaya çalıştım ancak 'gönderilirken bir hata oluştu' Bu yüzden herhangi bir test verisi olmadan deneyebileceğimi düşündüm .... t1 ve t2 - 'isim', 'stil', 'renk' ve 'kapılar' sütunlarını tutan iki tablo var.

. Her birinin, her şeyin eşit olduğu ve eşleşmeyen birkaç satırın bulunduğu bir dizi veri satırı vardır. Eğer 'isim' ve 'kapılar' her ikisi de eşitse, renk t1'de olup olmadığına bakmak için görünümde renge ihtiyacım var. 'Name' ve 'kapı' uyuşmuyorsa, ben 'turuncu'

Ben ilk değerini

belirleyen bir select deyimi ile görünümü seçim açıklamada bir nvl2 işlevi oluşturma çalıştı okumak için görünümünde renk ihtiyaç
nvl2(color, (select color from t1 where t1.style = t2.style and t1.doors = t2.doors), orange) 

Bir nvl2 işlevi bir seçim içerebilir mi? Yanlışlıkla yaptım mı, eğer öyleyse, nvl2 işlevi yerine ne kullanmalıyım?

+0

Googling 'nvsl' veya' nvsl2' anlamlı bir şey döndürmez. Belki nvl2'ye atıfta bulunabilir misiniz? – Mureinik

+1

tabiki ... çok editörlü, teşekkür ederim! – user761758

+0

Beklenen çıktınız nedir? Bazı örnek veriler iyi olurdu. –

cevap

0

Hedefleriniz çalıştığın şey biraz belirsiz, ama bu işe yarayabilir:

SELECT 
    t1.*, 
    CASE WHEN t2.name is not null THEN t1.color ELSE 'orange' END as color 
FROM 
    t1 
    LEFT JOIN t2 ON 
    t1.name = t2.name 
    AND t1.doors = t2.doors 

Sen katıldığında hangi biraz açık değil çünkü endişe t1 ve t2 sıralamasını değiştirmek gerekebilir satırlığınızı

'dan çıkarmak istediğiniz tablo renk seçim mantığınızı uygulamak için yalnızca bir LEFT JOIN ve CASE bildirimine ihtiyacınız vardır. Yorumlarınız sonra

Düzenleme:

Aslında bu mantık aradığınız düşünüyorum, ama yine de benim için açık değil:

SELECT 
    t1.*, 
    CASE WHEN t1.doors = t2.doors and t1.style = t2.style and t1.color = t2.color THEN t1.color ELSE 'orange' END as color 
FROM 
    t1 
    LEFT JOIN t2 ON 
    t1.name = t2.name 
+0

Spot on .. bir dava ile sol birleştirme yaptık .. var ve diğerlerinin de aynı şeyi görmek zorunda ...... ileri gitmeyi başarmak için en az kafa karıştırıcı yol gibi görünüyor ...... – user761758

1

Ben bunu yanlış yaklaşıyoruz düşünüyorum . t1 ve t2'un 0: [0..1] bir ilişkiye sahip olduğunu varsayarsak (ki bunların sahip olması gerektiğini tahmin edersiniz, ya da soru pek anlamlı olmaz), seçim silahınız left join ve nvl ya da bu yönde katıldıktan sonra (aşağıya bakınız): nvl bir Oracle fonksiyonudur

SELECT t2.*, NVL(t1.color, 'orange') 
FROM  t2 
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors 

Not olduğu. ANSI-SQL eşdeğer coalesce olmak ve bu uygulama daha taşınabilir bir tad yapacak kullanarak olacaktır:

SELECT t2.*, COALESCE(t1.color, 'orange') 
FROM  t2 
LEFT JOIN t1 ON t1.style = t2.style AND t1.doors = t2.doors 
+0

teşekkür ederim ... ve bir görüntü oluşturmada yer almak için? – user761758

+0

@ user761758 Bu seçkeyi bir "görünüm oluştur" ifadesinin içine tokatla: 'CREATE VIEW myview AS SELECT - etc ...'. – Mureinik