2012-11-16 10 views
10

To może być proste, ale nie jestem mistrzem SQL, więc się gubię. Rozumiem, że wykonuje zapytanie SQL i wykonuje je w określonej kolejności, co moim zdaniem jest dlaczego ta kwerenda nie działa:Sprawdź, czy pole jest numeryczne, a następnie wykonaj porównanie tylko na tych polach w jednej instrukcji?

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

Większość pól purchar_order_number są numeryczne, ale wprowadzamy te alfanumerycznych niedawno. Dane, które próbuję uzyskać, to sprawdzenie, czy "7" jest większe niż najwyższy numer numeru zakup_order.

Funkcja numeryczna() odfiltrowuje pola alfanumeryczne porządku, ale robi późniejsze porównanie rzucania rzuca ten błąd:

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

Nie pytam, co oznacza, że ​​błąd, to jest oczywiste. Pytam, czy istnieje sposób, aby osiągnąć to, co chcę w pojedynczej kwerendzie, najlepiej w klauzuli where z powodu ograniczeń ORM.

+1

Ponieważ jest to tylko jedna cyfra, można po prostu powiedzieć 'I purchase_order_number>„7'' –

+0

można podać schemat dla 'tabeli purchaseorders' tym indeksów? Próbuję zbudować repro - obecnie mogę uzyskać komunikat o błędzie z przykładem ShyJ, ale nie z twoją. –

Odpowiedz

22

to działa dla Ciebie?

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

Dzięki! Działa świetnie – ledgeJumper

1

można zrobić wybierz z podselekcji

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

@AaronBertrand Masz rację. Przepraszam. – ShyJ

+0

Jednak optymalizator może wciąż zapisać to zapytanie i przetworzyć rzutowanie przed filtrem. –

+0

@AaronBertrand Naprawdę może to zrobić? Ponieważ to zmieniłoby semantykę zapytania. – ShyJ

0

spróbuj tego:

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

Podczas gdy ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego stanowisko. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – bahrep

Powiązane problemy