Sincobile Nhlengethwa Ответов: 2

Как разделить строку на разные столбцы SQL-запроса


Это и есть стол
Контрключ
CIVUS0.35V
916148-010-CIVUS
916425-010-CIVUS
CIVUS0.35B
257198-010-CIVUS
916425-010-CIVUS
UCIVUS0.35P
7116-7004-08-UCIVUS
916148-010-UCIVUS
UCIVUS0.35P

Я хочу разделить counterKey на разные новые разные colunms, например
CounterKey             FirstPart       SecondPart        LastPart
CIVUS0.35V               CIVUS0          35                V
916148-010-CIVUS         916148          010               CIVUS
UCIVUS0.35P              UCIVUS0         35                P
7116-7004-08-UCIVUS      7116-700408     08                UCIVUS


Что я уже пробовал:

Я попробовал этот код:

SELECT top 10
     CounterKey,
	    REVERSE(PARSENAME(REPLACE(REVERSE(CounterKey), ',', '.'), 1)) AS FirstPart,
        REVERSE(PARSENAME(REPLACE(REVERSE(CounterKey), '',''), 2)) AS Lastpart    
  FROM [HHMachine].[Komax].[WPCS_Counter]


Он отображает данные следующим образом:
CounterKey	               FirstPart	Lastpart
CIVUS0.35V	                  CIVUS0	35V
916148-010-CIVUS	916148-010-CIVUS	NULL
916425-010-CIVUS	916425-010-CIVUS	NULL
CIVUS0.35B	                    CIVUS0	35B
257198-010-CIVUS	257198-010-CIVUS	NULL
916425-010-CIVUS	916425-010-CIVUS	NULL
UCIVUS0.35P	                 UCIVUS0	35P
7116-7004-08-UCIVUS	7116-7004-08-UCIVUS	NULL
916148-010-UCIVUS	916148-010-UCIVUS	NULL
UCIVUS0.35P	                 UCIVUS0	35P

2 Ответов

Рейтинг:
20

Maciej Los

Вы были очень близки к тому, чтобы найти решение...

;WITH CTE AS
(
  SELECT CounterKey,
    PARSENAME(CounterKey, 2) AS Part1,
    LEFT(PARSENAME(CounterKey, 1), 2) AS Part2,
    RIGHT(PARSENAME(CounterKey, 1), 1) AS Part3
  FROM SomeData
  WHERE CHARINDEX('.', CounterKey)>0
  UNION ALL
  SELECT  CounterKey,
    PARSENAME(REPLACE(CounterKey, '-', '.'), 3) AS Part1,
    PARSENAME(REPLACE(CounterKey, '-', '.'), 2) AS Part2,
    PARSENAME(REPLACE(CounterKey, '-', '.'), 1) AS Part3
  FROM SomeData
  WHERE CHARINDEX('-', CounterKey)>0
)
SELECT *
FROM CTE


db<>скрипка[^]

Результат:
CounterKey 	Part1 	Part2 	Part3
CIVUS0.35V 	CIVUS0 	35 	V
CIVUS0.35B 	CIVUS0 	35 	B
UCIVUS0.35P 	UCIVUS0 	35 	P
UCIVUS0.35P 	UCIVUS0 	35 	P
916148-010-CIVUS 	916148 	010 	CIVUS
916425-010-CIVUS 	916425 	010 	CIVUS
257198-010-CIVUS 	257198 	010 	CIVUS
916425-010-CIVUS 	916425 	010 	CIVUS
7116-7004-08-UCIVUS 	7004 	08 	UCIVUS
916148-010-UCIVUS 	916148 	010 	UCIVUS


Sincobile Nhlengethwa

Большое вам спасибо @Maciej Los это то, что я хотел

Maciej Los

Всегда пожалуйста.

Рейтинг:
0

OriginalGriff

Честно говоря, обработка строк SQL в лучшем случае плохая и громоздкая - если вы исправите свой SQL, чтобы сделать это, то в первый раз, когда он изменится или вы найдете там ключ "нового формата" (и вы это сделаете, вы это сделаете), вы будете смотреть на настоящий Пита, чтобы заставить его снова работать.

Вместо того чтобы разбивать его на SQL, разбейте его на своем языке представления (где обработка строк намного проще и более удобна для обслуживания) и сохраните "разбитые" биты в отдельных столбцах SQL - затем вы можете использовать вычисляемый столбец SQL для их рекомбинации очень легко, когда вам нужно все значение ключа.

Это гораздо более простая система для обслуживания и работы с ней!