2
votes

insérer dans la table avec diviser la chaîne en SQL

Je veux insérer ma chaîne de fractionnement dans ma table comme vous pouvez le voir:

1   1     1   1
2   2     2   2
3   3     3   3

Mon résultat attendu est quelque chose comme ceci:

create table #Organization
(
    organizationId bigint, 
     provienceId bigint, 
     CityId bigint, 
      TownId bigint 

)
Insert Into #Organization  ( organizationId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( provienceId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( CityId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( TownId) 
 select  p.value from  string_split('1,2,3', ',') p

Mais il renvoie ceci:

 entrez la description de l'image ici


6 commentaires

Vous avez besoin d'une instruction de mise à jour pour la deuxième et la troisième instruction


@PrashantPimpale Comment puis-je mettre à jour les enregistrements?


N'y a-t-il que trois valeurs à chaque fois ou ce ne sont pas des données réelles?


@PrashantPimpale ce ne sont pas des données réelles, elles peuvent être modifiées


oui exactement, pouvez-vous fournir des exemples de données avec lesquelles vous traitez réellement?


Votre instruction d'insertion a 3 colonnes et votre table a 4 colonnes. Veuillez définir quelles sont les colonnes dans l'instruction d'insertion.


3 Réponses :


2
votes

L'insertion insère trois lignes, une pour chaque valeur. Si vous voulez les combiner en colonnes, vous devez les faire pivoter ou (comme je préfère) utiliser l'agrégation.

Vous avez également une table avec quatre colonnes mais vous ne semblez en insérer que trois, donc je suppose que vous voulez: p>

Insert Into #Organization (provinceId, CityId, TownId) 
    select provinceId, CityId, TownId
    from (values('1,2,3')) v(str) cross apply
         (select max(case when seqnum = 1 then p.value end) as provinceid,
                 max(case when seqnum = 2 then p.value end) as cityid,
                 max(case when seqnum = 3 then p.value end) as townid                 
          from (select p.*,
                       row_number() over (order by charindex(',' + p.value + ',', ',' + v.str + ',')) as seqnum
                from string_split(v.str, ',') p
               ) p
         ) s;

(Je ne vois pas la nécessité de bigint pour cet exemple.)

Évidemment, la solution la plus simple n'est utilisez des chaînes:

Insert Into #Organization (provinceId, CityId, TownId) 
    values (1, 2, 3);

Mais si vous utilisez des chaînes, vous pouvez essayer:

create table #Organization (
    organizationId int identity(1, 1) primary key, 
    provinceId int, 
    CityId int, 
    TownId int 
);

Notez qu'il y a un problème en utilisant string_split () à cet effet, car il ne "se souvient" pas de la position de la sous-chaîne dans la chaîne d'origine. Cela tente de contourner ce problème en utilisant charindex () . Dans votre cas, cela fonctionnera, car les valeurs sont toutes des nombres.

Ici est un violon db .


3 commentaires

J'attends une réponse de votre part!


Merci, mais je veux dire que le 1,2,3 est un exemple, il peut être changé en d'autres valeurs


@EhsanAkbar. . . Et rien dans cette réponse n'exclut cela. Avez-vous regardé le violon db <>? Il a des exemples d'autres valeurs.



3
votes

Je lis peut-être votre question, mais je pense que vous souhaitez diviser votre chaîne en colonnes

Exemple

Pos1    Pos2    Pos3
1       2       3
A       B       C
Dog     Cat     Pony

Retours

Declare @YourTable table (SomeColName varchar(max)) 
Insert Into @YourTable values 
 ('1,2,3')
,('A,B,C')
,('Dog,Cat,Pony')

Select B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(SomeColName ,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B


6 commentaires

si je veux changer le 1 2 3, 4 5 6, 7 8 9 en 1 4 7, 2 5 8, 3 6 9, que dois-je faire?


Cherchez-vous des manipulations matricielles? Modifiez peut-être votre question et ajoutez un échantillon de données plus distinct et les résultats souhaités.


@EhsanAkbar Heureux d'aider ... je suppose :)


Salut encore, en fait dans ma question j'attends ces résultats, 1 1 1 1,2 2 2 2, 3 3 3 3, pourriez-vous s'il vous plaît m'aider comment puis-je obtenir ce résultat?


j'ai changé ma question


@EhsanAkbar Si vous avez 2016+, la réponse de Gordon est correcte. Sinon, voici un dbfiddle.uk/…



0
votes

J'utiliserais pivot pour transformer les colonnes en lignes. Comme:

INSERT INTO #organization 
            (provinceid, 
             cityid, 
             townid) 
SELECT * 
FROM   (SELECT p.value, 
               RowN = Row_number() 
                        OVER ( 
                          ORDER BY (SELECT NULL)) 
        FROM   String_split('1,2,3', ',') p) a 
       PIVOT (Max(a.value) 
             FOR rown IN ([1], 
                          [2], 
                          [3])) b 


1 commentaires

Salut encore, en fait dans ma question j'attends ces résultats, 1 1 1 1,2 2 2 2, 3 3 3 3, pourriez-vous s'il vous plaît m'aider comment puis-je obtenir ce résultat?