1
votes

TSQL - Analyse d'une sous-chaîne à partir d'une chaîne plus grande

J'ai un tas de lignes avec des valeurs qui ressemblent à celles ci-dessous. C'est un extrait json que je dois malheureusement analyser et charger. Quoi qu'il en soit, mon outil d'analyse json pour une raison quelconque ne veut pas analyser cette colonne complète, je dois donc le faire dans TSQL. Je n'ai besoin que du champ unique_id:

select substring([jsonfield],CHARINDEX('[{"unique_id":"',[jsonfield]), 
CHARINDEX('"',[jsonfield]) - CHARINDEX('[{"unique_id":"',[jsonfield]) + 
LEN('"')) from etl.my_test_table

J'ai essayé le SQL ci-dessous mais il ne renvoie que les 5 premiers caractères de toute la colonne. Je sais quel est le problème qui est que j'ai besoin de savoir comment dire à la sous-chaîne de continuer jusqu'au 4ème ensemble de guillemets qui vient après la valeur. Je ne sais pas comment coder la sous-chaîne comme ça.

[{"unique_id":"12345","system_type":"Test System."}]

Quelqu'un peut-il m'aider avec ça?

Merci, je l'apprécie!


1 commentaires

"Quoi qu'il en soit, mon outil d'analyse json pour une raison quelconque ne veut pas analyser cette colonne complète" Avez-vous essayé de poster une question à ce sujet avant de chercher une solution de contournement TSQL?


3 Réponses :


0
votes

Procédez pas à pas

Commencez par obtenir tout ce qui se trouve à gauche de system_type

SELECT RIGHT(S, LEN(S) - (CHARINDEX('"unique_id":"',S) + 12)) as Result
FROM (
  SELECT LEFT(jsonfield, CHARINDEX('","system_type":"',jsonfield) as s
  FROM -- etc
) X

Ensuite, prenez tout ce qui se trouve à droite de "unique_id": "

SELECT LEFT(jsonfield, CHARINDEX('","system_type":"',jsonfield) as s
FROM -- etc

Remarque, je n'ai pas testé ceci afin qu'il puisse être désactivé par un ou avoir une erreur de syntaxe, mais vous voyez l'idée.

p>


1 commentaires

@Shnugo - bien sûr, et si quelqu'un fait une recherche basée sur le sujet, ma réponse pourrait être utile, je ne la supprimerai donc pas.



2
votes

Depuis que vous avez balisé 2016, pourquoi ne pas utiliser OPENJSON ()

Voici un exemple:

SELECT [b].[unique_id]
     , [b].[system_type]
FROM   @TestData [a]
CROSS APPLY
       OPENJSON([a].[SampleData], '$')
           WITH (
                    [unique_id] NVARCHAR(100) '$.unique_id'
                  , [system_type] NVARCHAR(100) '$.system_type'
                ) AS [b];

Vous donnant:

unique_id
---------------
12345
1234567
1234567_2


0 commentaires

0
votes

Si votre chaîne plus grande n'est qu'un simple JSON tel que publié, la solution est très simple:

SELECT 
JSON_VALUE(N'[{"unique_id":"12345","system_type":"Test System."}]','$[0].unique_id');

JSON_VALUE () besoins SQL-Server 2016 et extraira une seule valeur d'un chemin spécifié.


0 commentaires