2015-02-06 2 views
0

У меня есть следующий сценарий. Поле VARCHAR может иметь только 1 из 2 значений:SQL - подсчет INT из поля VARCHAR

'12345 - some random text' 
'87654321 - some random text' 

Я хочу сделать выбор только значения INT и используя этот следующий запрос я нахожусь почти там, но я не хватает одного ключевого компонента:

SELECT 
    CASE 
    WHEN (ColumnName LIKE '%[0-9][0-9][0-9][0-9][0-9]%') 
      then SUBSTRING(ColumnName ,0 ,CHARINDEX('',ColumnName)+6) 
    WHEN (ColumnName LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%') 
      then SUBSTRING(ColumnName ,0 ,CHARINDEX('',ColumnName)+9) 
    ELSE (NULL) END 
FROM dbo.TableName 

Фактический результат:

12345 
87654 

Ожидаемый результат:

12345 
87654321 

Пожалуйста, кто-нибудь может указать на одну простую вещь, которую мне не хватает?

+0

У ЛЕВЫЙ до первого символа пробела, отлитый результат в целое. – jarlh

+0

Или просто переключитесь на порядок вещей, самый длинный, как первый ... – jarlh

+0

Рассмотрим рефакторинг схемы. Если такого рода вещи (два поля данных, упакованные в одно поле) часто требуют разделения, превратите их в два отдельных поля. Легче и гораздо быстрее конкатенировать два поля, когда это необходимо, чем искать разделитель в составном поле. Двухполевой подход непосредственно индексируется, а одно поле - нет. – wallyk

ответ

2

Если вы хотите получать ведущее значение целого числа, вы можете искать место и взять все, прежде чем что:

select left(ColumnName, charindex(' ', ColumnName) - 1) 

Вы можете использовать cast() преобразовать это целое число, если вам нравится.

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

И причина, по которой вы не получаете то, что хотите. Условия находятся в неправильном порядке. Более длинное целое число соответствует первому условию, и case останавливается.

1

Просто

SELECT 
    CAST(SUBSTRING_INDEX((ColumnName , '-', 1)) 
FROM dbo.TableName 
Смежные вопросы