SQL Server 2005 Преобразование VARCHAR в INT, но по умолчанию для недопустимого типа - PullRequest
7 голосов
/ 10 марта 2010

У меня есть столбец varchar (100) в таблице, которая содержит комбинацию целых чисел (в виде строк) и нецелых строк. Э.Г.

| dimension varchar(100) |
| '5'                    |
| '17'                   |
| '3'                    |
| 'Pyramids'             |
| 'Western Bypass'       |
| '15'                   |

Как мне написать выражение, например, суммировать все значения, которые являются действительными целыми числами? Если бы я попытался:

-- should return 5 + 17 + 3 + 15 = 40
SELECT
    SUM( CONVERT( INT, dimension ) )
FROM
    mytable

Я получил бы ошибку Conversion failed when converting the varchar value 'Pyramids' to data type int..

Есть ли в моем выражении тест, очень похожий на функцию ISNULL(), который позволяет мне указать значение по умолчанию, если поле не является числом?

Ответы [ 2 ]

20 голосов
/ 10 марта 2010

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

SELECT
    SUM(CASE ISNUMERIC(dimension) 
           WHEN 1 THEN CONVERT( INT, dimension ) 
           ELSE 0  
        END)
FROM
    mytable

CASE должен проверить, является ли dimension числовым - если это так, вернуть это значение. Если это не число, вернуть значение по умолчанию (здесь: 0)

Если вам нужно выполнять такие частые запросы, вы также можете добавить в таблицу постоянный вычисляемый столбец, который инкапсулирует эти вычисления и сохраняет значение. Таким образом, при суммировании и т. Д. Вы не всегда пересчитываете значение:

ALTER TABLE mytable
  ADD NumericValue AS CASE ISNUMERIC(dimension) 
      WHEN 1 THEN CONVERT( INT, dimension ) ELSE 0 END PERSISTED

Теперь вы можете SELECT dimension, numericvalue FROM mytable и получить оба значения без необходимости каких-либо вычислений.

1 голос
/ 29 мая 2012

Вы столкнетесь с проблемами переполнения, если у вас есть varchar как 88888888888888888888888

select
SUM(
    CASE 
      WHEN ISNUMERIC(CheckCol+ '.0e0') = 1  AND 
      convert(decimal(38,0), CheckCol) 
      BETWEEN -2147483648 AND 2147483647 
    THEN  1
    ELSE 0
    END
)  
from Table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...