SQL Server Преобразование 2005 года VARCHAR к INT, но значению по умолчанию на недопустимом типе

У меня есть 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

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

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

7
задан PP. 10 March 2010 в 18:21
поделиться

1 ответ

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

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 и получить оба значения без необходимости выполнения каких-либо вычислений.

20
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: