Выберите и отфильтруйте nvarchar как int - PullRequest
2 голосов
/ 07 апреля 2009

В моей базе данных MS SQL 2005 есть столбец nvarchar BigMacs в таблице McTable с буквенно-цифровыми и числовыми значениями. Например:

  • 132
  • 432adfad
  • sfs54543
  • 5256

А теперь я хотел бы сделать что-то вроде этого:

select Convert(BigMacs, int) from McTable
where IsNumerc(BigMacs) = 1 AND Convert(BigMacs, int) > 6

Но когда я делаю это, я получаю ошибку:

Сообщение 245, Уровень 16, Состояние 1, Строка 41 Ошибка преобразования при преобразовании значения nvarchar '. ' в тип данных int.

On line select.

Как это исправить?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2009

Вероятно, это связано с тем, что функция IsNumeric возвращает true для любого значения, которое МОЖЕТ быть преобразовано в число. Попробуйте следующий пример:

create table McTable  (BigMac varchar(255))

insert into McTable  select '1p927'
insert into McTable  select '1927'
insert into McTable  select '1,927'
insert into McTable  select '1.927'

select BigMac, isnumeric(BigMac)
from McTable 

select BigMac, CAST(BigMac AS DECIMAL)
from McTable 
where isnumeric(BigMac) = 1

Даже если все строки, кроме '1p927', являются числовыми, приведение не будет выполнено! Это потому, что «1,927» не может быть преобразовано в десятичную (на моем компьютере)

IsNumeric не работает точно так, как указано. Как найдено здесь , вы можете использовать

IsNumeric (data + 'e0')

-Edo

2 голосов
/ 07 апреля 2009

Есть много способов сделать это. Оба из них работают одинаково. Лучше не использовать замену в этой ситуации, так как существует слишком много неизвестных для замены. Лучше всего фильтровать все, что НЕ то, что вам нужно.

SELECT
    CONVERT(INT,BigMacs) AS BigMacs
FROM
    McTable
WHERE
    ISNUMERIC(BigMacs) = 1
AND PATINDEX('%[^0-9]%', BigMacs) = 0


SELECT
    CONVERT(INT,BigMacs) AS BigMacs
FROM
    McTable
WHERE
    ISNUMERIC(BigMacs) = 1
AND BigMacs NOT LIKE ('%[^0-9]%')

Примечание: помогает, если люди правильно пишут ISNUMERIC (). Также полезно, если вы используете правильный порядок синтаксиса в CONVERT ()

2 голосов
/ 07 апреля 2009

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

SELECT  *
FROM    (
        SELECT  REPLACE(BigMacs, ',', '.') AS BigMacs
        FROM    McTable m
        WHERE   IsNumerc(BigMacs) = 1
        ) q
WHERE   CAST(BigMacs AS DECIMAL) > 6

IsNumeric вернет TRUE в десятичных дробях, таких как 1234.1232, но их нельзя преобразовать в INT.

Проверка:

WITH McTable AS
        (
        SELECT '123124,123123' AS BigMacs
        )
SELECT  *
FROM    (
        SELECT  REPLACE(BigMacs, ',', '.') AS BigMacs
        FROM    McTable
        WHERE   IsNumeric(BigMacs) = 1
        ) q
WHERE   CAST(BigMacs AS DECIMAL) > 6

-----------
123124.123123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...