2016-05-16 1 views
-1

J'ai une table feeds avec une colonne de tableau JSON (UserLike) des gens qui aiment ça. Le tableau sera comme:filtre SQL Server 2016 dans json_value

FeedID FeedName UserLike 
1  Feed 1  [{"UserID":1,"UserName":"User 1"},{"UserID":2,"UserName":"User 2"},...] 
2  Feed 2  [{"UserID":1,"UserName":"User 1"},{"UserID":2,"UserName":"User 2"},...] 
3  Feed 3  [{"UserID":1,"UserName":"User 1"}] 

Je veux obtenir la liste des flux et exactement comme informations de connexion de l'utilisateur par comparaison UserID (s'il a aimé, ou non retourner null UserLike, je veux obtenir la ligne d'alimentation, même si la connexion l'utilisateur n'est pas dans la liste UserLike).

Comment puis-je le faire? T-pris en charge par SQL quelque chose comme:

select 
    FeedID, FeedName, 
    Json_value(UserLike, '$[UserID=1].UserName')... 

Le résultat que je prévois est:

FeedID FeedName UserID UserName 
1  Feed 1  2  User 2 
2  Feed 2  2  User 2 
3  Feed 3  NULL NULL 

avec clause WHERE: UserID = 2

Répondre

0
--Here we take all feeds 
;WITH cte AS (
SELECT DISTINCT FeedID, 
       FeedName 
FROM dbo.feeds 
--Here we take parsed JSON 
), feeds AS (
SELECT FeedID, 
     FeedName, 
     UserID, 
     UserName 
FROM [dbo].[feeds] f 
CROSS APPLY OPENJSON ([UserLike]) 
WITH (
    UserID int, 
    UserName nvarchar(255) 
)) 
--And here we join them 
SELECT c.FeedID, 
     c.FeedName, 
     f.UserID, 
     f.UserName 
FROM cte c 
LEFT JOIN feeds f 
    ON f.FeedID = c.FeedID and f.UserID = 2 

Sortie:

FeedID FeedName UserID UserName 
1  Feed 1  2  User 2 
2  Feed 2  2  User 2 
3  Feed 3  NULL NULL 
+0

salut @ gofr1: Tout d'abord, je vous remercie beaucoup pour votre réponse. Deuxièmement, désolé, je n'écris pas clairement la structure de la table. Il doit être comme ceci
'FeedID FeedName UserLike 1 Flux 1 [{" UserID ": 1," UserName ":" User 1 "}, {" UserID ": 2," UserName ":" User 2 "}, ...] 2 RSS 2 [{ "UserID": 1, "UserName": "User 1"}, { "UserID": 2, "UserName": "User 2"}, ...] 3 RSS 3 [{ "UserID": 1, "UserName": "1 utilisateur"}] '
user3238543

+0

S'il vous plaît, modifier votre question, ce code difficile à lire des commentaires. – gofr1

+0

hi @ gofr1: D'abord, merci beaucoup pour votre réponse. Deuxièmement, désolé, je n'écris pas clairement la structure de la table. Il a fixé dans mon message. Donc, j'ai essayé d'utiliser 'CROSS APPLY OPENJSON (UserLike)'. Mais la chose est, l'enregistrement sans userID de l'utilisateur de connexion dans UserLike ne montrera pas. Et la liste retournée n'est pas excellement ce que je veux. Je veux obtenir la liste des flux, et l'info si je l'ai aimé ou non. Ajouter une instruction WHERE après une application croisée openjson me fera manquer des enregistrements. Avez-vous des conseils, ou je fais mal? Merci beaucoup !! Désolé, mon poste première fois dans la pile :). – user3238543