2012-11-16 19 views
10

Bu basit olabilir, ancak ben SQL vızıltı değilim, bu yüzden kayboluyorum. Ben sql sorgunuzu alır ve bu sorgu neden çalışmıyor olduğuna inanıyoruz olan belirli bir sırayla çalıştırır anlıyoruz: purchar_order_number alanlarının EN Alanın sayısal olup olmadığını kontrol edin, ardından yalnızca bir alandaki alandaki karşılaştırmayı yürütün?

select * from purchaseorders 
where IsNumeric(purchase_order_number) = 1 
and cast(purchase_order_number as int) >= 7 

sayısal, ama biz son zamanlarda alfanümerik olanları tanıtmak. Almaya çalıştığım veriler, '7' en yüksek sayısal satın alma_tarih_sayı olup olmadığını görmek.

Sayısal() fonksiyonu ince alfanümerik alanları filtreleyen, ancak daha sonraki döküm karşılaştırma yapıyor bu hatayı atar: Ben hata ne anlama geldiğini soran değilim

Conversion failed when converting the nvarchar value '124-4356AB' to data type int. 

, aşikârdır. Tek bir sorguda istediğimi yerine getirmenin bir yolu olup olmadığını, tercihen ORM kısıtlamalarına bağlı olarak nerede olduğunu soruyorum.

+1

yalnızca bir basamak, sadece –

+0

Eğer dizinleri dahil 'purchaseorders' tablo için şema sağlayabilir 7'' PURCHASE_ORDER_NUMBER>' demek' VE olabilir olduğuna göre? Bir repro oluşturmaya çalışıyorum - şu anda hata mesajını ShyJ'in örneğiyle alabiliyorum ama sizinkilerle değil. –

cevap

22

sizin için bu işi yapar ile seçilmiş yapabilir?

select * from purchaseorders 
where (case when IsNumeric(purchase_order_number) = 1 
     then cast(purchase_order_number as int) 
     else 0 end) >= 7 
+0

Teşekkürler! Harika çalışıyor – ledgeJumper

1

Bir subselect

select * from (
select * from purchaseorders 
where IsNumeric(purchase_order_number) = 1) as correct_orders 
where cast(purchase_order_number as int) >= 7 
+0

@AaronBertrand Haklısınız. Afedersiniz. – ShyJ

+0

Ancak optimizer bu sorguyu yeniden yazabilir ve filtreden önce döküm işlemini işleyebilir. –

+0

@AaronBertrand Bunu gerçekten yapabilir mi? Çünkü bu, sorgunun semantiğini değiştirir. – ShyJ

0

bu deneyin:

select * from purchaseorders 
where try_cast(purchase_order_number as int) >= 7 
+0

Bu kod pasajı [bir açıklama dahil] sorunu çözebilirken (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) gerçekten de sonrası. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerilerinizin nedenini bilmeyebileceğini unutmayın. – bahrep

İlgili konular