-2
votes

Comment extraire des caractères d'une chaîne stockée sous forme de données JSON et placez-les dans un nombre dynamique de colonnes dans SQL Server.

J'ai une colonne de chaîne dans SQL Server qui stocke des données JSON avec tous les accolades et tous les colons inclus.

Mon problème consiste à extraire toutes les couples de la clé et de la valeur et de les stocker dans des colonnes séparées avec la clé comme en-tête de colonne. Ce qui rend ce stimulant, c'est que chaque enregistrement a un nombre différent de clé / valeur paires.

Par exemple dans l'image ci-dessous montrant 3 enregistrements, le premier enregistrement a 5 paires de clé / valeur - endusecommunitymarket de 2 , MARCHE DE 0 , etc. Le deuxième enregistrement a 1 paire de clé / valeur et que la troisième enregistrement a deux paires de clé / valeur.

Entrez la description de l'image ici

si j'ai Pour montrer comment je veux cela dans Excel, ce serait comme:

Entrez la description de l'image ici

J'ai vu des exemples de code SQL qui fait quelque chose de similaire Mais pour un nombre fixe de colonnes, contrairement à celui-ci, il varie pour chaque enregistrement.

Veuillez j'ai besoin d'une instruction SQL pouvant y parvenir, car je travaille sur des milliers d'enregistrements.

Voici ces données copiées depuis SQL Server : xxx


5 commentaires

Êtes-vous capable de dire, quel est le nombre maximum de colonnes d'une seule valeur JSON possible?


Quelques astuces: ne postez pas de photos. Mieux vaut coller les données, ce qui nous permet de reprendre cela dans un environnement de test avec copier et coller . Personne ne veut taper cela dans. Le meilleur était un exemple de reproductible minimal . Et veuillez ajouter votre version de SQL Server. Le support JSON a été ajouté non avant V2016. Ma suggestion: fournir aux exemples de JSON pour voir votre problème en principe. Trouver une solution pour deux vous aidera à trouver une solution pour beaucoup.


@Dineshdb Il peut y avoir au plus 6 paires de clé / valeur pour 6 colonnes


@Shnugo J'ai ajouté des données SQL SQL RAW à la fin de ma question ci-dessus pour vous permettre de copier et de coller dans un environnement de test.


@Eloga, quelle version de SQL Server vous utilisez?


3 Réponses :


0
votes

Je pense que vous ne voulez pas créer de manière dynamique une table, vous souhaitez probablement créer une table de mappage de propriétés. Voici un aperçu rapide de la conception.

OBJECT 
ID     NAME
1      WHAOO
2      RED SNAMPPER
3      KAWAKAWA

Property Types
ID     DESC
1      EndUseCommunityMarket
2      EndUseProvincialMarket 
3      EndUseUrbanMarket
4      EndUseEaten
5      EndUseGivenAway
6      Comment

Map
ObjID   TypeID   Value
1        1       2  
1        2       0
1        3       0
1        4       0
1        5       0
2        2       50
3        3       8
3        5       1


2 commentaires

Je ne veux pas créer de tables à partir de la conception, tout ce que je veux, c'est une SQL qui interroge cette table et transformer les données dans cette colonne spécifique (Catch_ext) en les plaçant dans des colonnes séparées nommées d'après les noms de clés. Par exemple, des données que je viens d'ajouter à ma question ci-dessus, les noms de colonnes seraient enduseaten, marquage endusecommunity, espèces Quelque chose comme l'image Excel a également montré dans ma question.


Je comprends ce que vous voulez - je suggère que c'est la meilleure façon de le faire. Esp. Si vous n'avez pas de nombre maximum de colonnes (que vous n'avez pas fait quand j'ai écrit cette réponse.) Si vous avez un nombre maximal de colonnes - il n'est pas dynamique. Ensuite, il est beaucoup plus facile.



0
votes

a. Les lignes

Les colonnes dynamiques sont beaucoup comme des lignes. P>

Vous pouvez utiliser openjson (transact-sql) code> xxx pré>

sortie p> xxx pré>

vos entrées h1> xxx pré>

sortie H2>
SELECT store.title, location.street, location.lat, location.long  
FROM store  
CROSS APPLY OPENJSON(store.jsonCol, 'lax $.location')   
WITH (
     street varchar(500),
     postcode  varchar(500) '$.postcode',  
     lon int '$.geo.longitude', 
     lat int '$.geo.latitude'
) AS location


0 commentaires

0
votes

Essayez ceci:

SCHEMA DE TABLE: STRAND> P>

sp_name       EndUseCommunityMarket EndUseProvincialMarket EndUseUrbanMarket EndUseEaten EndUseGivenAway
------------- --------------------- ---------------------- ----------------- ----------- ---------------
KAWAKAWA      2                                                                          
RUBY SNAPPER  3                                                                          
WAHOO                                                                        1           
XXXXXXXX                                                                     31          
YYYYYYYY      0                     0                      8                 1           1
ZZZZZZZZZZ                                                                   18  


0 commentaires