web-dev-qa-db-fra.com

Vérifier si le champ est numérique, puis exécuter la comparaison uniquement sur ces champs dans une instruction?

Cela peut sembler simple, mais je ne suis pas un as de SQL et je me perds. Je comprends que SQL prend votre requête et l’exécute dans un certain ordre, ce qui explique pourquoi cette requête ne fonctionne pas:

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

La plupart des champs purchar_order_number sont numériques, mais nous en avons récemment introduit des alphanumériques. Les données que j'essaye d'obtenir sont de voir si "7" est supérieur au chiffre d'achat le plus élevé. 

La fonction Numeric () filtre parfaitement les champs alphanumériques, mais la comparaison de distribution ultérieure génère cette erreur:

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

Je ne demande pas ce que l'erreur signifie, c'est évident. Je demande s'il existe un moyen d'accomplir ce que je veux dans une requête unique, de préférence dans la clause where en raison de contraintes ORM.

14
ledgeJumper

est-ce que ça marche pour toi?

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

Vous pouvez faire une sélection avec une sous-sélection

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

essaye ça:

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