2017-10-11 6 views
2

Je veux diviser une chaîne à chaque caractère et afficher chacun d'entre eux dans une rangée séparée. J'ai aussi besoin d'une colonne supplémentaire (Col2) qui devrait indiquer si le caractère est un nombre ou non (si nombre, puis 1 sinon 0).SQL: Comment diviser une chaîne à chaque caractère à afficher dans une rangée séparée?

Exemple:

Si les données sont '11 Octobre, 2017', je devrais

Col1 Col2 
O 0 
c 0 
t 0 
o 0 
b 0 
e 0 
r 0 
    0 
1 1 
1 1 
, 0 
    0 
2 1 
0 1 
1 1 
7 1 

Répondre

1

Une méthode utilise un CTE récursive:

with cte as (
     select cast('October 11, 2017' as varchar(max)) as str, 
      cast(NULL as varchar(max)) as letter, 0 as lev 
     union all 
     select substring(str, 2, len(str)), left(str, 1), lev + 1 
     from cte 
     where str <> '' 
    ) 
select letter, 
     (case when letter between '0' and '9' then 1 else 0 end) as is_digit 
from cte 
where lev > 0; 

Si la chaîne peut avoir plus de 99 caractères, alors vous voudriez utiliser l'option de récursivité maximale.

Here est un Rextester.

+0

u doit vérifier la réponse avant de poster. –

+0

Les types ne correspondent pas entre l'ancre et la partie récursive dans la colonne "lettre" de la requête récursive "cte". –

+0

Obtention d'un message d'erreur: Les types ne correspondent pas entre l'ancre et la partie récursive dans la colonne "lettre" de la requête récursive "cte". –

3

Essayez ceci:

CREATE TABLE tbSeperate (Data NVARCHAR(100)) 

INSERT INTO tbSeperate SELECT 'October 11, 2017' 

SELECT SUBSTRING(Data,Number,1) rt , CASE WHEN TRY_CAST(SUBSTRING(Data,Number,1) AS INT) IS NULL THEN 0 
WHEN SUBSTRING(Data,Number,1) = ' ' THEN 0 ELSE 1 END c FROM tbSeperate 
CROSS APPLY (SELECT DISTINCT number FROM master..spt_values WHERE number > 0 AND number <= LEN(Data))V 
+0

Travailler. Merci! –

2

Vous pouvez l'utiliser.

DECLARE @data VARCHAR(100) = 'October 11, 2017' 

;WITH CTE AS 
(
    SELECT STUFF(@data,1,1,'') TXT, LEFT(@data,1) Col1 

    UNION ALL 

    SELECT STUFF(TXT,1,1,'') TXT, LEFT(TXT,1) Col1 FROM CTE 
    WHERE LEN(TXT) > 0 
) 
select Col1, ISNUMERIC(Col1) from CTE 

Résultat:

Col1 Col2 
---- ----------- 
O 0 
c 0 
t 0 
o 0 
b 0 
e 0 
r 0 
    0 
1 1 
1 1 
, 1 
    0 
2 1 
0 1 
1 1 
7 1