Skip to content

Commit e7ae8c6

Browse files
authored
Update README.md
1 parent 5efc880 commit e7ae8c6

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

README.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,95 @@ var deleteQuery = query.ToDeleteQuery("table_b", new[] { "table_a_id" });
344344
var 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

349438
CarbunqleX 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

Comments
 (0)