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 クエリパターンを示しています。