簡體   English   中英

SQL:從 SQL 服務器中的嵌套 JSON 中查找最大值

[英]SQL:Finding max value from a nested JSON in SQL Server

這個問題在這個 SO 線程中有一個參考。

我想計算下面 JSON 的MAX()值。 此外,其中的鍵也不是固定的,因此根據上述解決方案,它們不能在代碼中編碼。

DECLARE @json nvarchar(max) = ''{"value": [
 {
   "AEDAT": "20211119",
   "ERDAT": "20211119"
 },
 {
    "AEDAT": "20211119",
    "ERDAT": "20211112"
 },
 {
   "AEDAT": "20211123",
   "ERDAT": "20211123"
 },
 {
   "AEDAT": "00000000",
   "ERDAT": "20211119"
 },
 {
   "AEDAT": "00000000",
   "ERDAT": "20211123"
  }]}';

此外,我將從其他一些 SP 獲取以下字符串作為參數。

DECLARE @ColumnName = 'AEDAT,ERDAT' ---I shall be getting this as an output from another SP.

綜上所述,我的做法如下:

DECLARE @col_table TABLE (ID int IDENTITY(1,1), ColumnName varchar(100))
INSERT INTO @col_table SELECT value as ColumnName FROM STRING_SPLIT(@ColumnName,','); 
DECLARE @max_val TABLE (ID int IDENTITY(1,1), LastUpdatedValue int) 
DECLARE @max_ID int
DECLARE @min_ID int
DECLARE @1st_col varchar(max)
SELECT @max_ID = MAX(ID),@min_ID = MIN(ID) FROM @col_table GROUP BY ColumnName;

WHILE (@min_ID <= @max_ID)
  BEGIN
  SELECT @1st_col =  ColumnName FROM @col_table WHERE ID = @min_ID
  INSERT INTO @max_val (LastUpdatedValue)
  SELECT JSON_VALUE(j.value,'$.' +@1st_col+ '' ) FROM OPENJSON(@json,'$.value') AS j
  SET @min_ID = @min_ID + 1
  END

理想情況下,上述方法應該給出 10 個值(AEDAT 和 ERDAT 各 5 個)但這給了我 5 個值。

SELECT * FORM @max_val;
 ID  LastUpdatedValue
 1    20211119
 2    20211112
 3    20211123
 4    20211119
 5    20211123

我期待 output 就像UNION ALL一樣。 像下面

 SELECT JSON_VALUE(j.value,'$.AEDAT') FROM OPENJSON(@json,'$.value') AS j
 UNION ALL
 SELECT JSON_VALUE(j.value,'$.ERDAT') FROM OPENJSON(@json,'$.value') AS j

我錯過了什么? 請建議。

您可以使用OPENJSON兩次,一次打開數組,再次取消旋轉鍵。 然后只需按您的表變量過濾

DECLARE @col_table TABLE (ColumnName varchar(100) COLLATE Latin1_General_BIN2 PRIMARY KEY)
INSERT INTO @col_table (ColumnName)
SELECT value
FROM STRING_SPLIT(@ColumnName,','); 

SELECT
  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
  j2.[key],
  j2.value
FROM OPENJSON(@json, '$.value') j1
CROSS APPLY OPENJSON(j1.value) j2
WHERE CAST(j2.[key] AS varchar(100)) IN (
    SELECT c.ColumnName
    FROM @col_table c
);

db<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM