Questo è un approccio basato set:
;WITH Tally (n) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
), UnpivotCTE AS (
SELECT id, x.c, n, y.isNumber,
n - ROW_NUMBER() OVER (PARTITION BY id, y.isNumber
ORDER BY n) AS grp
FROM mytable
CROSS JOIN Tally
CROSS APPLY (SELECT SUBSTRING(col, n, 1)) AS x(c)
CROSS APPLY (SELECT ISNUMERIC(x.c)) AS y(isNumber)
WHERE n <= LEN(col)
), ToConcatCTE AS (
SELECT id, c, n, isNumber,
grp + MIN(n) OVER (PARTITION BY id, isNumber, grp) AS grpAsc
FROM UnpivotCTE
)
SELECT id, col,
REPLACE(
(SELECT c AS [text()]
FROM ToConcatCTE AS t
WHERE t.id = m.id
ORDER BY id,
grpAsc,
CASE WHEN isNumber = 0 THEN n END,
CASE WHEN isNumber = 1 THEN n END DESC
FOR XML PATH('')), ' ',' ') AS col2
FROM mytable AS m
Una tabella conteggio viene utilizzato al fine di 'UNPIVOT' tutto caratteri della stringa. Quindi viene utilizzato ROW_NUMBER
per identificare isole di caratteri numerici e non numerici. Infine, FOR XML PATH
viene utilizzato per ricostruire la stringa iniziale con isole numeriche invertite: ORDER BY
viene utilizzato per ordinare isole di caratteri numerici in ordine inverso.
Fiddle Demo here
È questo solo per divertimento, o di un incarico stupido, o un problema di lavoro vero e proprio? – jarlh
La parte numeri è invertita e la necessità di ripristinare nei miei dati – jozi
Molto dipende dai parametri attorno alla stringa. Ci sono sempre parole prima e dopo i numeri e sono le parole della stessa lunghezza o di diverse lunghezze? – russ