Проверить, является ли поле числовым, затем выполнить сравнение только для этих полей в одном операторе?

Это может быть просто, но я не обладаю знаниями в SQL, поэтому теряюсь. Я понимаю, что sql принимает ваш запрос и выполняет его в определенном порядке, поэтому я считаю, что этот запрос не работает:

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

Большинство из полей towar_order_number являются числовыми, но недавно мы представили буквенно-цифровые поля. Данные, которые я пытаюсь получить, это увидеть, если '7' больше, чем самый высокий числовой номер покупки.

Функция Numeric () отлично отфильтровывает буквенно-цифровые поля, но при последующем сравнении приведений выдает эту ошибку:

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

Я не спрашиваю, что означает ошибка, это очевидно. Я спрашиваю, есть ли способ выполнить то, что я хочу, в одном запросе, предпочтительно в предложении where из-за ограничений ORM.

 Aaron Bertrand16 нояб. 2012 г., 17:51
С тех пор'только одна цифра, вы могли бы просто сказатьAND purchase_order_number > '7'
 Aaron Bertrand16 нояб. 2012 г., 18:01
Можете ли вы предоставить схему дляpurchaseorders таблица, включающая индексы? Я'я пытаюсь построить репро - я в настоящее время могу получить сообщение об ошибке с ShyJ 'с твоим примером.

Ответы на вопрос(3)

Вы можете сделать выбор с помощью подвыбора

select * from (
select * from purchaseorders
where IsNumeric(purchase_order_number) = 1) as correct_orders
where cast(purchase_order_number as int) >= 7
 ShyJ16 нояб. 2012 г., 17:33
@AaronBertrand You 'верно. Сожалею.
 Aaron Bertrand16 нояб. 2012 г., 17:33
Но оптимизатор может переписать этот запрос и обработать приведение перед фильтром.
 ledgeJumper16 нояб. 2012 г., 17:39
Да, если сделать это таким образом, ошибка все равно выдастся, поэтому я считаю, что @AaronBertrand верен.
 ShyJ16 нояб. 2012 г., 17:39
@AaronBertrand На самом деле то, что выГоворят, что фильтрация до того, как приведение может изменить конечный результат, может просто провалиться. Сейчас я'Я не являюсь экспертом по SQL Server, но хотел бы узнать, упоминается ли он где-нибудь в документе или любой из таких случаев может быть легко воспроизведен.
 ShyJ16 нояб. 2012 г., 17:34
@AaronBertrand Это действительно может сделать это? Потому что это изменило бы семантику запроса.
 Aaron Bertrand16 нояб. 2012 г., 17:47
Я нене думаю, что тынайду это задокументировано, как Хонда победилат документ в их владельцеЭто руководство, что если вы попытаетесь погрузить машину в воду, радио может не работать. И нет, получить ошибку неизменение конечного результата. " План нене знаю, что тыВы получите ошибку во время выполнения, так как это зависит от данных, а план нехранить данные.
 Aaron Bertrand16 нояб. 2012 г., 17:36
Как это изменит семантику? Фильтрация до или после броска неизменить конечный результат. Помните, что SQL декларативен - выповторять оптимизатору, какой результат вы хотите, кроме васне заставлять его, как это сделать. Когда вы сводите его, все, что вам нужно будет изменить, это то, сколько строк обменивается между какими операторами.
 Aaron Bertrand16 нояб. 2012 г., 17:54
Посмотрите на это так: SQL Server видит, что вы хотите отфильтровать нечисловые значения, а также отфильтровать числовые значения < 7. Это нене нужно делать это в том порядке, в котором вы написали запрос - этодостаточно умен, чтобы разобрать это в дерево и переставить, если необходимо. В этом случае я подозреваю, что двигатель нашел более эффективным сначала отфильтровать результат. Что касается семантики - если у вас есть мрамор и вы хотите удалить стали и стеклянные стекла, это не так.Неважно, если вы сначала удалите сталь, а сначала стекло, конечный результат будет таким же. Правильно?
Решение Вопроса

это работает для вас?

select * from purchaseorders
where (case when IsNumeric(purchase_order_number) = 1
       then cast(purchase_order_number as int)
       else 0 end) >= 7
 ledgeJumper16 нояб. 2012 г., 18:04
Спасибо! Работает отлично

попробуй это:

select * from purchaseorders
where try_cast(purchase_order_number as int) >= 7
 bahrep15 февр. 2017 г., 18:58
Хотя этот фрагмент кода может решить вопрос,в том числе объяснение действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.

Ваш ответ на вопрос