Как извлечь часть строки в SQL перед первым из повторяющихся символов? - PullRequest
0 голосов
/ 11 марта 2020

У меня в SQl строках со следующими смешанными значениями.

322600;323800;325000;326200;327400;329200
0;0;0;0;0;0
1184168;1188182;1192196;1196210;1200224;1204238
0;0;0;0;0;0
0;0;0;0;0;0

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

322600
0
1184168
0
0

Я пытался:

,LEFT ([UtilizeProperties],CHARINDEX(';',[CalcTotGrossIncome])-1) 

но я получаю только 3 первые цифры, а

,SUBSTRING([UtilizeProperties],CHARINDEX(';',[UtilizeProperties])-1,LEN([UtilizeProperties])-CHARINDEX(';',[UtilizeProperties])) 

делает мои первые значения равными 0, а

,SUBSTRING([UtilizeProperties],CHARINDEX(';',[UtilizeProperties])+1,LEN([UtilizeProperties])) 

полностью их убирает.

Благодарен за добрый совет.

Я использую SQL Service Management Studio

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Ваш первый подход верен, за исключением того, что вы используете разные столбцы в LEFT и CHARINDEX. Изменить так:

LEFT(UtilizeProperties, NULLIF(CHARINDEX(';', UtilizeProperties), 0) - 1)
0 голосов
/ 11 марта 2020

Вы можете попробовать следующий запрос CHARINDEX (Transact- SQL) .

Эта функция ищет одно символьное выражение внутри второго символьного выражения, возвращая начальную позицию первого выражение, если найдено.

Синтаксис

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Чтобы получить все значения, вам нужно заменить UNION на UNION ALL. Вы можете добавить предложение order by в окончательный запрос для сортировки значений.

with cte (SampleData) as
(
select '322600;323800;325000;326200;327400;329200'
union
select '0;0;0;0;0;0'
union
select '1184168;1188182;1192196;1196210;1200224;1204238'
union
select '0;0;0;0;0;0'
union
select '0;0;0;0;0;0'
)
SELECT 
        CAST(LEFT(SampleData, CHARINDEX(';', SampleData)-1) AS INT) OutputValue
From cte

Вот демо db <> fiddle .

...