0

この質問には、この SO スレッドの参照があります。

MAX()以下のJSONの値を計算したい。また、これのキーは固定されていないため、上記のソリューションに従って、コードにハードコードすることはできません。

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

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

私が見逃しているものは何ですか?提案してください。

4

1 に答える 1