Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server : build JSON dynamic key

Tags:

sql-server

I'm trying to create object with dynamic key and value with SQL Server. Currently I have the following query result:

[ 
    { "Name": "Ashley", "type": "human" },
    { "Name": "Dori", "type": "cat" }
]

and I am looking to build this:

[ { "Human": "Ashley" }, { "Cat": "Dori" } ]

PS: I'm not sure if it's even possible, but I have no ideas left.

like image 718
Simeon Lazarov Avatar asked Oct 18 '25 07:10

Simeon Lazarov


1 Answers

If you know every possible combination up front, you can specify them in CASE expressions like this

SELECT
    Human = CASE WHEN t.[type] = 'human' THEN t.Name END,
    Cat =   CASE WHEN t.[type] = 'cat'   THEN t.Name END
-- more options
FROM YourTable t
FOR JSON PATH;

If you don't know what the possible options are, you will need dynamic SQL.

Try to keep a clear head about which part is static and which is dynamic. Use PRINT @sql; to test.

DECLARE @sql nvarchar(max) = '
SELECT
' + (
    SELECT STRING_AGG(CAST(
'    ' + typeCol + ' = CASE WHEN t.[Type] = ' + typeStr + ' THEN t.Name END'
        AS nvarchar(max)), ',
')
    FROM (
        SELECT DISTINCT
           typeCol = QUOTENAME(UPPER(LEFT(t.[type], 1)) + SUBSTRING(t.[type], 2, LEN(t.[type]))),
           typeStr = QUOTENAME(t.[type], '''')
        FROM YourTable t
    )
) + '
FROM YourTable t
FOR JSON PATH;
';

PRINT @sql; --for testing

EXEC sp_executesql @sql;  -- add parameters if necessary
like image 154
Charlieface Avatar answered Oct 21 '25 04:10

Charlieface



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!