Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CAST und IsNumeric

IsNumeric gibt 1 zurück, wenn der varchar-Wert in einen beliebigen Zahlentyp konvertiert werden kann. Dazu gehören int, bigint, decimal, numeric, real &float.

Die wissenschaftliche Schreibweise könnte Ihnen ein Problem bereiten. Zum Beispiel:

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values(NULL)
Insert Into @Temp Values('1')
Insert Into @Temp Values('1e4')
Insert Into @Temp Values('Not a number')

Select Cast(Data as bigint)
From   @Temp
Where  IsNumeric(Data) = 1 And Data Is Not NULL

Es gibt einen Trick, den Sie mit IsNumeric verwenden können, damit es 0 für Zahlen mit wissenschaftlicher Notation zurückgibt. Sie können einen ähnlichen Trick anwenden, um Dezimalwerte zu verhindern.

IsNumeric(YourColumn + 'e0')

IsNumeric(YourColumn + '.0e0')

Probieren Sie es aus.

SELECT CAST(myVarcharColumn AS bigint)
FROM myTable
WHERE IsNumeric(myVarcharColumn + '.0e0') = 1 AND myVarcharColumn IS NOT NULL
GROUP BY myVarcharColumn