0
votes

Convertir une chaîne JSON dans des champs séparés

J'ai une table avec deux colonnes: xxx

ici, les RawData permettront de sauvegarder les données de format JSON dans la chaîne, par exemple ci-dessous sera les données de cette colonne: < Pré> xxx

Résultat attendu:

J'ai besoin de ces noms personnalisés, Customercumber, LoandisbProduct à afficher dans des champs distincts pour chaque rangée. Aussi de noter que les détails du client à l'intérieur de Rawdata pour chaque ligne seront plus de deux dans de nombreux cas.

Je ne sais pas comment déchirer les données à l'intérieur de la colonne Rawdata.

et je 'M Utilisation de SQL Server 2012 et il ne prend pas en charge les données JSON, je dois donc manipuler la chaîne et obtenir le champ.


3 Réponses :


0
votes

Merci à BLOG DE GATE RED , Définissez d'abord une vue code> comme suit: (Je vais utiliser ce Voir code> pour générer un nouveau unique identifiant" / code> à l'intérieur de la fonction) xxx pré>

puis créez une fonction comme suit (cette fonction est identique à celle du blog de porte rouge, mais je l'ai changé un peu et inclure Le identifiant code> en elle): p> xxx pré>

Enfin, si nous avons ce tableau et les données: p>

CustomerName    | CustomerNumber   | LoanDisbProduct
------------------------------------------------------
John            |    192222        |   null
Mahalakshmi     |    430833        |   Emergency Loan
K C Nalina      |    1917889       |   null
weldon          |    435874        |   Emergency Loan


0 commentaires

0
votes

Si vous ne savez pas combien de clients pour chaque ligne, vous ne devez pas déchiqueter chaque client à un seul champ, au moins un client PR de la rangée.

Voici un démarrage sur la déchiquetage des données, j'utilise le DBO.String_Split fonction de cette page:

premier i Split par {} dans le JSON, puis je me suis séparé par ",", puis vous avez le nom et la valeur d'attribut pour chaque identifiant, avec la numérotation des clients de chaque rangée. P>

Je pourrais avoir été divisé sur ', de la même manière que pour' {...} 'Cependant, j'ai choisi d'utiliser une fonction pour cela. P>

Tout dépend de la même structure du JSON . Pour mieux analyser SQL Server 2016+ serait recommandé. P>

+─────+────────────────+──────────────────+─────────────────+
| id  | CustomerOrder  | Attribute        | value           |
+─────+────────────────+──────────────────+─────────────────+
| 1   | 1              | customerName     | K C Nalina      |
| 1   | 1              | attendance       | P               |
| 1   | 1              | collectedAmount  | 757             |
| 1   | 1              | isOverdrafted    | false           |
| 1   | 1              | loanDisbProduct  | null            |
| 1   | 1              | paidBy           | Y               |
| 1   | 1              | customerNumber   | 1917889         |
| 1   | 1              | totalDue         | 757             |
| 2   | 1              | customerName     | John            |
| 2   | 1              | attendance       | P               |
| 2   | 1              | collectedAmount  | 700             |
| 2   | 1              | isOverdrafted    | false           |
| 2   | 1              | loanDisbProduct  | null            |
| 2   | 1              | paidBy           | Y               |
| 2   | 1              | customerNumber   | 192222          |
| 2   | 1              | totalDue         | 788             |
| 2   | 2              | customerName     | weldon          |
| 2   | 2              | attendance       | P               |
| 2   | 2              | collectedAmount  | 771             |
| 2   | 2              | isOverdrafted    | false           |
| 2   | 2              | loanDisbProduct  | Emergency Loan  |
| 2   | 2              | paidBy           | Y               |
| 2   | 2              | customerNumber   | 435874          |
| 2   | 2              | totalDue         | 757             |
| 1   | 2              | customerName     | Mahalakshmi     |
| 1   | 2              | attendance       | P               |
| 1   | 2              | collectedAmount  | 881             |
| 1   | 2              | isOverdrafted    | false           |
| 1   | 2              | loanDisbProduct  | Emergency Loan  |
| 1   | 2              | paidBy           | Y               |
| 1   | 2              | customerNumber   | 430833          |
| 1   | 2              | totalDue         | 757             |
+─────+────────────────+──────────────────+─────────────────+


3 commentaires

La fonction string_split est disponible dans SQL Server 2016 ou supérieure. Niveau de compatibilité 130 ou supérieur, et n'est pas disponible dans SQL Server 2012 ( docs.microsoft.com/en-us/sql/t-sql/functions/.../a>)


Ouais c'est pourquoi j'ai inclus un lien vers une mise en œuvre qui fonctionne en 2012;)


Super travail Søren!



0
votes

meilleur était de passer à V2016 +. Avec le support JSON, c'était facile ...

sur V2012, vous devez pirater. Ce pourrait être un meilleur choix d'utiliser un autre outil pour cela. Mais, si vous devez vous tenir à TSQL, j'essaierais de transformer le JSON en attributs XML centré comme ici: p> xxx pré>

- la requête p>

SELECT cd.id
      ,OneCustomer.value('@customerName','nvarchar(max)') AS CustomerName
      ,OneCustomer.value('@attendance','nvarchar(max)') AS Attendance
      --more attributes 
FROM @customerData cd
CROSS APPLY(SELECT REPLACE(REPLACE(REPLACE(cd.rawData,'false','"0"'),'true','"1"'),'null','"#NULL"')) A(JustStringValues)
CROSS APPLY(SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(JustStringValues,'[',''),']',''),'},{"',' /><x '),'{"','<x '),'}',' />'),'","','" '),'":"','="') AS XML)) B(SinlgeRow)
CROSS APPLY B.SinlgeRow.nodes('/x') AS C(OneCustomer);


0 commentaires