2016-05-16 55 views
-1

我有一個feeds表和json數組列(UserLike)的人誰喜歡它。表將是這樣的:json_value中的SQL Server 2016篩選器

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"}] 

我想獲取提要列表,酷似通過比較UserID(如果他喜歡,或者不回UserLike空用戶登錄的信息,我想進行即使登錄用戶不在UserLike列表中)。

我該怎麼辦?請問T-SQL支持一些事情,如:

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

結果,我很期待是:

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

與WHERE子句:用戶名= 2

回答

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 

輸出:

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

hi @ gofr1:首先,非常感謝您的回答。第二,對不起,我沒有寫清楚表格結構。它必須是這樣
'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」}]'
user3238543

+0

請編輯您的問題,此代碼難以閱讀評論。 – gofr1

+0

hi @ gofr1:首先,非常感謝你的回答。第二,對不起,我沒有寫清楚表格結構。它在我的帖子中已經修復。 所以,我嘗試使用'CROSS APPLY OPENJSON(UserLike)'。但事實是,UserLike中沒有登錄用戶的UserID的記錄不會顯示。而且返回的列表並不是我想要的。我想要得到提要列表,以及如果我喜歡或不喜歡的信息。交叉應用openjson後添加WHERE語句會讓我錯過一些記錄。你有任何建議,或者我做錯了嗎?非常感謝你 !! 對不起,我第一次發帖堆棧:)。 – user3238543