#sql-server #tsql
#sql-сервер #tsql
Вопрос:
У меня есть база необработанных данных, в которой все указано как varchar, один из столбцов содержит цену, которую по большей части легко преобразовать в FLOAT. Однако есть несколько строк, которые содержат мусор в этом столбце с кучей символов и не преобразуются в float .
Есть ли способ выбрать только те строки, которые будут преобразованы в float (т. Е. только те, которые на самом деле имеют номер)?
Спасибо
Ответ №1:
Примечание: Важно включить 'e0'
в числовой тест, поскольку такие вещи, как ' '
, '$'
, '.'
и '3e8'
, в противном случае возвращали бы 1.
SELECT *
FROM YourTable
WHERE ISNUMERIC(YourColumn 'e0') = 1
Комментарии:
1. Также важно не предполагать, что
WHERE
это произойдет раньшеCAST
. Оператору все равно потребуется использоватьCASE WHEN ISNUMERIC(YourColumn 'e0') = 1 THEN CAST(YourColumn AS FLOAT) END
вSELECT
списке, чтобы избежать возможности недопустимых ошибок приведения.
Ответ №2:
Вы пробовали использовать функцию ISNUMERIC?
SELECT *
FROM <table>
where ISNUMERIC(column)=1
Смотрите ISNUMERIC().
Ответ №3:
Попробуйте сначала использовать функцию ISNUMERIC, и только когда она будет числовой, примените ПРИВЕДЕНИЕ.
Ответ №4:
Если вы используете SQL Server 2012 и ISNUMERIC()
он вам подходит, вы можете использовать TRY_PARSE()
который позволяет указать точный тип данных.
WHERE TRY_PARSE(price_col AS FLOAT) IS NOT NULL
Кроме того, вы не должны использовать неточные типы данных для currency. Вы должны использовать ЧИСЛОВЫЕ, ДЕСЯТИЧНЫЕ или ДЕНЕЖНЫЕ значения.