@@ -344,6 +344,95 @@ var deleteQuery = query.ToDeleteQuery("table_b", new[] { "table_a_id" });
344344var expected = " DELETE FROM table_b WHERE table_b.table_a_id IN (SELECT q.table_a_id FROM (SELECT a.table_a_id, 1 AS value FROM table_a AS a) AS q)" ;
345345```
346346
347+ ### 10. Converting a Query to Return JSON (Postgres-only)
348+
349+ In PostgreSQL, you can transform a query to return JSON using functions like ` json_build_object ` and ` row_to_json ` .
350+
351+ ``` csharp
352+ var query = QueryAstParser .Parse ("""
353+ SELECT
354+ posts.post_id,
355+ posts.title,
356+ posts.content,
357+ posts.created_at,
358+ users.user_id,
359+ users.name AS user_name,
360+ blogs.blog_id,
361+ blogs.name AS blog_name,
362+ organizations.organization_id,
363+ organizations.name AS organization_name
364+ FROM posts
365+ INNER JOIN users ON posts.user_id = users.user_id
366+ INNER JOIN blogs ON posts.blog_id = blogs.blog_id
367+ INNER JOIN organizations ON blogs.organization_id = organizations.organization_id
368+ WHERE posts.post_id = 1
369+ """ );
370+
371+ query .NormalizeSelectClause ()
372+ .Serialize (" organizations" , objectName : " organization" )
373+ .Serialize (" users" , objectName : " user" )
374+ .Serialize (" blogs" , objectName : " blog" , include : [" organization" ])
375+ .Serialize (" posts" , objectName : " post" , include : [" user" , " blog" ])
376+ .ToJson ();
377+ ```
378+
379+ #### 🔍 Expected SQL output
380+
381+ ``` sql
382+ SELECT row_to_json(d)
383+ FROM (
384+ SELECT json_build_object(
385+ ' post_id' , posts .post_id ,
386+ ' title' , posts .title ,
387+ ' content' , posts .content ,
388+ ' created_at' , posts .created_at ,
389+ ' user' , json_build_object(
390+ ' user_id' , users .user_id ,
391+ ' user_name' , users .name
392+ ),
393+ ' blog' , json_build_object(
394+ ' blog_id' , blogs .blog_id ,
395+ ' blog_name' , blogs .name ,
396+ ' organization' , json_build_object(
397+ ' organization_id' , organizations .organization_id ,
398+ ' organization_name' , organizations .name
399+ )
400+ )
401+ ) AS post
402+ FROM posts
403+ INNER JOIN users ON posts .user_id = users .user_id
404+ INNER JOIN blogs ON posts .blog_id = blogs .blog_id
405+ INNER JOIN organizations ON blogs .organization_id = organizations .organization_id
406+ WHERE posts .post_id = :post_id
407+ ) AS d
408+ LIMIT 1 ;
409+ ```
410+
411+ #### 🔍 Query Output
412+
413+ ``` json
414+ {
415+ "post" : {
416+ "post_id" : 9 ,
417+ "title" : " Understanding AI" ,
418+ "content" : " This is a post about AI." ,
419+ "created_at" : " 2025-02-18T20:25:21.974106" ,
420+ "user" : {
421+ "user_id" : 1 ,
422+ "user_name" : " Alice"
423+ },
424+ "blog" : {
425+ "blog_id" : 1 ,
426+ "blog_name" : " AI Insights" ,
427+ "organization" : {
428+ "organization_id" : 1 ,
429+ "organization_name" : " Tech Corp"
430+ }
431+ }
432+ }
433+ }
434+ ```
435+
347436## 📌 Conclusion
348437
349438CarbunqleX makes raw SQL ** more maintainable, reusable, and dynamically modifiable** without sacrificing performance. Its AST-based transformations provide a powerful way to manipulate queries at scale, making it an essential tool for advanced SQL users.
0 commit comments