2017-07-17 1 views
-2

Comment puis-je diviser une ligne séparée par des virgules avec 10 valeurs en deux lignes, dans lequel la première ligne contient les 5 premières valeurs et la ligne suivante les 5 dernières valeurs dans SQL ServerFractionner une chaîne séparée en deux lignes dans SQL Server

+1

Avez-vous la recherche pour les fonctions de chaînes séparées dans Sql Server? Au fait, quelle version du serveur sql vous utilisez? –

+0

s'il vous plaît poster quelques exemples de données et le résultat attendu en DDL et aussi montrer ce que vous avez essayé – TheGameiswar

+0

Ce n'est pas difficile à faire. Vous pouvez utiliser n'importe quelle fonction de division de chaîne qui inclut un numéro de ligne (ou en créer une personnalisée, mais les fonctions de séparation de chaînes ne sont pas difficiles à trouver), vous utiliserez une agrégation de cas avec une fonction mod (par exemple 'SELECT Val1 = MAX (cas où RN% 5 = 1 puis Val END), Val2 = MAX (cas où RN% 5 = 2 puis Val END) ... ') et grouper par (RN - 1)/5 – ZLK

Répondre

0

Ceci est juste un exemple comment vous pouvez le faire fonctionner

CREATE TABLE T 
(ColSplit varchar(100) 
) 

INSERT INTO T VALUES 
('a,b,c,d,e,f,g,h,i,j'); 

SELECT VALUE 
FROM STRING_SPLIT((SELECT ColSplit FROM T),',') 

se référer ici pour plus d'informations sur STRING_SPLIT

0

vous devriez vraiment revoir la conception de votre base de données.
Le stockage de listes délimitées dans une base de données est une mauvaise conception, comme je l'ai écrit dans mon commentaire.

Cependant, si pour une raison quelconque, vous ne pouvez pas changer la conception de base de données, vous pouvez faire quelque chose comme ceci:

DECLARE @MyString varchar(100) = 'a,bc,def,ghij,klmno,pqrstu,vwxyz12,34567890,1qaz2wsx3,edc4rfv5tg,b6yhn7ujm' 


;WITH CTE AS 
(
    SELECT @MyString As string, 
      CHARINDEX(',', @MyString) As commaIndex, 
      1 as commaNumber 
    UNION ALL 
    SELECT string, 
      CHARINDEX(',', string, commaIndex + 1), 
      commaNumber + 1 
    FROM CTE 
    WHERE CHARINDEX(',', string, commaIndex + 1) > 0 
) 


SELECT SUBSTRING(string, 1, commaIndex-1) 
FROM CTE 
WHERE commaNumber = 5 

UNION ALL 

SELECT SUBSTRING(string, commaIndex+1, LEN(string)) 
FROM CTE 
WHERE commaNumber = 5 

Le résultat:

a,bc,def,ghij,klmno 
pqrstu,vwxyz12,34567890,1qaz2wsx3,edc4rfv5tg,b6yhn7ujm