Skip to content

Instantly share code, notes, and snippets.

@aleclarson
Created June 24, 2025 18:38
Show Gist options
  • Save aleclarson/b3081b396438af427800aa23e8e81250 to your computer and use it in GitHub Desktop.
Save aleclarson/b3081b396438af427800aa23e8e81250 to your computer and use it in GitHub Desktop.
An incomplete attempt at "SELECT without FROM" in Drizzle
import { sql, Subquery, WithSubquery, type SQL, type SQLWrapper } from 'drizzle-orm'
import type { SelectResultField } from 'drizzle-orm/query-builders/select.types'
type SelectResultFields<TSelectedFields extends Record<string, any>> = {
[K in keyof TSelectedFields]: TSelectedFields[K] extends SQLWrapper
? SelectResultField<TSelectedFields[K]>
: SQL<TSelectedFields[K]>
}
export function select<TAlias extends string, const TSelectedFields extends Record<string, any>>(
alias: TAlias,
fields: TSelectedFields
) {
return new WithSubquery(
sql<SelectResultFields<TSelectedFields>>`SELECT ${sql.join(
Object.entries(fields).map(([key, value]) => {
if (!('_' in value) || 'alias' in value._) {
return sql`${value}`
}
return sql`${value} AS ${key}`
}),
sql`, `
)}`,
{},
'',
)
}
// WITH date_range AS (
// SELECT generate_series('2023-01-01'::date, '2023-12-31'::date, '1 MONTH'::interval)::date AS date
// )
// import { db } from '~/db/client.ts'
// db.$with('date_range').as(() =>
// select('date_range', {
// date: sql`generate_series('2023-01-01'::date, '2023-12-31'::date, '1 MONTH'::interval)::date`,
// })
// )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment