Select
Bob を使用した PostgreSQL の SELECT クエリの例を以下に示します。
Simple Select with some conditions
条件付きの簡単な SELECT クエリ:
SELECT sm.id, sm.name
FROM seeded_models sm
WHERE (sm.id > $1)
AND (sm.name <> $2)
ORDER BY sm.id
LIMIT $3
psql.Select(
sm.Columns("id", "name"),
).From(
sm.Name().As("sm"),
).Where(
sm.ColByName("id").GT(psql.Arg(100)),
sm.ColByName("name").NE(psql.Arg("test")),
).OrderBy(
sm.ColByName("id"),
).Limit(10)
Case With Else
CASE 文(ELSE 付き):
SELECT
CASE
WHEN sm.id > $1 THEN $2
ELSE $3
END
FROM seeded_models sm
psql.Select(
psql.Case().
When(sm.ColByName("id").GT(psql.Arg(100)), psql.Arg("high")).
Else(psql.Arg("low")),
).From(
sm.Name().As("sm"),
)
Case Without Else
CASE 文(ELSE なし):
SELECT
CASE
WHEN sm.id > $1 THEN $2
END
FROM seeded_models sm
psql.Select(
psql.Case().
When(sm.ColByName("id").GT(psql.Arg(100)), psql.Arg("high")),
).From(
sm.Name().As("sm"),
)
Select Distinct
DISTINCT を使用した SELECT:
SELECT DISTINCT sm.name
FROM seeded_models sm
psql.Select(
sm.Columns("name"),
).Distinct().From(
sm.Name().As("sm"),
)
Select Distinct On
DISTINCT ON を使用した SELECT(PostgreSQL 固有):
SELECT DISTINCT ON (sm.name) sm.id, sm.name
FROM seeded_models sm
psql.Select(
sm.Columns("id", "name"),
).DistinctOn(
sm.ColByName("name"),
).From(
sm.Name().As("sm"),
)
Select From Function
関数からの SELECT:
SELECT * FROM unnest($1::text[]) AS t(name)
psql.Select(
psql.Raw("*"),
).From(
psql.F("unnest", psql.Arg([]string{"a", "b", "c"})).As("t").Columns("name"),
)
Select from group of functions
複数の関数からの SELECT:
SELECT * FROM unnest($1::text[], $2::int[]) AS t(name, id)
psql.Select(
psql.Raw("*"),
).From(
psql.F("unnest",
psql.Arg([]string{"a", "b"}),
psql.Arg([]int{1, 2}),
).As("t").Columns("name", "id"),
)
Select from subquery with window function
ウィンドウ関数を使用したサブクエリからの SELECT:
SELECT *
FROM (
SELECT sm.id, sm.name,
ROW_NUMBER() OVER (ORDER BY sm.id) AS rn
FROM seeded_models sm
) AS ranked
WHERE rn = 1
subquery := psql.Select(
sm.Columns("id", "name"),
psql.F("ROW_NUMBER").Over().OrderBy(sm.ColByName("id")).As("rn"),
).From(
sm.Name().As("sm"),
)
psql.Select(
psql.Raw("*"),
).From(
subquery.As("ranked"),
).Where(
psql.Quote("rn").EQ(psql.Arg(1)),
)
Select With Grouped IN
グループ化された IN 句を使用した SELECT:
SELECT sm.id, sm.name
FROM seeded_models sm
WHERE sm.id IN ($1, $2, $3)
psql.Select(
sm.Columns("id", "name"),
).From(
sm.Name().As("sm"),
).Where(
sm.ColByName("id").In(psql.Arg(1), psql.Arg(2), psql.Arg(3)),
)
Simple select with limit and offset as argument
引数として LIMIT と OFFSET を使用した SELECT:
SELECT sm.id, sm.name
FROM seeded_models sm
LIMIT $1 OFFSET $2
psql.Select(
sm.Columns("id", "name"),
).From(
sm.Name().As("sm"),
).Limit(psql.Arg(10)).Offset(psql.Arg(20))
Join Using
USING を使用した JOIN:
SELECT sm.id, sm.name, sm2.email
FROM seeded_models sm
JOIN seeded_models sm2 USING (id)
psql.Select(
sm.Columns("id", "name"),
psql.Quote("sm2", "email"),
).From(
sm.Name().As("sm"),
).Join(
sm.Name().As("sm2"),
psql.Using("id"),
)
CTE With Column Aliases
カラムエイリアスを使用した CTE:
WITH regional_sales (region, total_sales) AS (
SELECT sm.name, SUM(sm.id)
FROM seeded_models sm
GROUP BY sm.name
)
SELECT * FROM regional_sales
cte := psql.Select(
sm.Columns("name"),
psql.F("SUM", sm.ColByName("id")),
).From(
sm.Name().As("sm"),
).GroupBy(
sm.ColByName("name"),
)
psql.Select(
psql.Raw("*"),
).With(
"regional_sales", cte,
).WithColumns("region", "total_sales").From(
psql.Quote("regional_sales"),
)
Window Function Over Empty Frame
空のフレームでのウィンドウ関数:
SELECT sm.id, sm.name,
ROW_NUMBER() OVER () AS rn
FROM seeded_models sm
psql.Select(
sm.Columns("id", "name"),
psql.F("ROW_NUMBER").Over().As("rn"),
).From(
sm.Name().As("sm"),
)
Window Function Over Window Name
ウィンドウ名を使用したウィンドウ関数:
SELECT sm.id, sm.name,
ROW_NUMBER() OVER w AS rn
FROM seeded_models sm
WINDOW w AS (ORDER BY sm.id)
psql.Select(
sm.Columns("id", "name"),
psql.F("ROW_NUMBER").Over("w").As("rn"),
).From(
sm.Name().As("sm"),
).Window(
"w", psql.OrderBy(sm.ColByName("id")),
)
Select With Order By And Collate
ORDER BY と COLLATE を使用した SELECT:
SELECT sm.id, sm.name
FROM seeded_models sm
ORDER BY sm.name COLLATE "C"
psql.Select(
sm.Columns("id", "name"),
).From(
sm.Name().As("sm"),
).OrderBy(
sm.ColByName("name").Collate("C"),
)
With Cross Join
CROSS JOIN を使用した SELECT:
SELECT sm1.id, sm2.name
FROM seeded_models sm1
CROSS JOIN seeded_models sm2
psql.Select(
psql.Quote("sm1", "id"),
psql.Quote("sm2", "name"),
).From(
sm.Name().As("sm1"),
).CrossJoin(
sm.Name().As("sm2"),
)
With Locking
ロック句を使用した SELECT:
SELECT sm.id, sm.name
FROM seeded_models sm
FOR UPDATE
psql.Select(
sm.Columns("id", "name"),
).From(
sm.Name().As("sm"),
).ForUpdate()
Multiple Unions
複数の UNION を使用した SELECT:
SELECT sm.id, sm.name FROM seeded_models sm WHERE sm.id = $1
UNION
SELECT sm.id, sm.name FROM seeded_models sm WHERE sm.id = $2
UNION
SELECT sm.id, sm.name FROM seeded_models sm WHERE sm.id = $3
query1 := psql.Select(sm.Columns("id", "name")).
From(sm.Name().As("sm")).
Where(sm.ColByName("id").EQ(psql.Arg(1)))
query2 := psql.Select(sm.Columns("id", "name")).
From(sm.Name().As("sm")).
Where(sm.ColByName("id").EQ(psql.Arg(2)))
query3 := psql.Select(sm.Columns("id", "name")).
From(sm.Name().As("sm")).
Where(sm.ColByName("id").EQ(psql.Arg(3)))
query1.Union(query2).Union(query3)
これらの例は、Bob を使用して PostgreSQL で実行可能な様々な SELECT クエリパターンを示しています。