@simplysm/orm-node 13.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +418 -0
- package/dist/connections/mssql-db-conn.js +386 -0
- package/dist/connections/mssql-db-conn.js.map +7 -0
- package/dist/connections/mysql-db-conn.js +227 -0
- package/dist/connections/mysql-db-conn.js.map +7 -0
- package/dist/connections/postgresql-db-conn.js +191 -0
- package/dist/connections/postgresql-db-conn.js.map +7 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/db-conn-factory.js +88 -0
- package/dist/db-conn-factory.js.map +7 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +7 -0
- package/dist/node-db-context-executor.js +129 -0
- package/dist/node-db-context-executor.js.map +7 -0
- package/dist/orm-common/src/db-context.d.ts +669 -0
- package/dist/orm-common/src/db-context.d.ts.map +1 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
- package/dist/orm-common/src/exec/executable.d.ts +79 -0
- package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/queryable.d.ts +708 -0
- package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
- package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr.d.ts +1369 -0
- package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
- package/dist/orm-common/src/index.d.ts +32 -0
- package/dist/orm-common/src/index.d.ts.map +1 -0
- package/dist/orm-common/src/models/system-migration.d.ts +10 -0
- package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
- package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
- package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
- package/dist/orm-common/src/types/column.d.ts +172 -0
- package/dist/orm-common/src/types/column.d.ts.map +1 -0
- package/dist/orm-common/src/types/db.d.ts +175 -0
- package/dist/orm-common/src/types/db.d.ts.map +1 -0
- package/dist/orm-common/src/types/expr.d.ts +474 -0
- package/dist/orm-common/src/types/expr.d.ts.map +1 -0
- package/dist/orm-common/src/types/query-def.d.ts +351 -0
- package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
- package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
- package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts +44 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts +38 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +39 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/db-conn-factory.d.ts +25 -0
- package/dist/orm-node/src/db-conn-factory.d.ts.map +1 -0
- package/dist/orm-node/src/index.d.ts +9 -0
- package/dist/orm-node/src/index.d.ts.map +1 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts +77 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts.map +1 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts +79 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/sd-orm.d.ts +78 -0
- package/dist/orm-node/src/sd-orm.d.ts.map +1 -0
- package/dist/orm-node/src/types/db-conn.d.ts +159 -0
- package/dist/orm-node/src/types/db-conn.d.ts.map +1 -0
- package/dist/pooled-db-conn.js +134 -0
- package/dist/pooled-db-conn.js.map +7 -0
- package/dist/sd-orm.js +44 -0
- package/dist/sd-orm.js.map +7 -0
- package/dist/types/db-conn.js +17 -0
- package/dist/types/db-conn.js.map +7 -0
- package/package.json +53 -0
|
@@ -0,0 +1,1369 @@
|
|
|
1
|
+
import { type DateOnly, type DateTime, type Time } from "@simplysm/core-common";
|
|
2
|
+
import { type ColumnPrimitive, type ColumnPrimitiveMap, type ColumnPrimitiveStr, type DataType, type InferColumnPrimitiveFromDataType } from "../types/column";
|
|
3
|
+
import type { ExprInput } from "./expr-unit";
|
|
4
|
+
import { ExprUnit, WhereExprUnit } from "./expr-unit";
|
|
5
|
+
import type { Expr, DateSeparator } from "../types/expr";
|
|
6
|
+
import type { SelectQueryDef } from "../types/query-def";
|
|
7
|
+
import type { Queryable } from "../exec/queryable";
|
|
8
|
+
interface WinSpecInput {
|
|
9
|
+
partitionBy?: ExprInput<ColumnPrimitive>[];
|
|
10
|
+
orderBy?: [ExprInput<ColumnPrimitive>, ("ASC" | "DESC")?][];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Switch 표현식 빌더 인터페이스
|
|
14
|
+
*/
|
|
15
|
+
export interface SwitchExprBuilder<T extends ColumnPrimitive> {
|
|
16
|
+
case(condition: WhereExprUnit, then: ExprInput<T>): SwitchExprBuilder<T>;
|
|
17
|
+
default(value: ExprInput<T>): ExprUnit<T>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Dialect 독립적인 SQL 표현식 빌더
|
|
21
|
+
*
|
|
22
|
+
* SQL 문자열이 아닌 JSON AST(Expr)를 생성하여, QueryBuilder가
|
|
23
|
+
* 각 DBMS(MySQL, MSSQL, PostgreSQL)에 맞게 변환
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // WHERE 조건
|
|
28
|
+
* db.user().where((u) => [
|
|
29
|
+
* expr.eq(u.status, "active"),
|
|
30
|
+
* expr.gt(u.age, 18),
|
|
31
|
+
* ])
|
|
32
|
+
*
|
|
33
|
+
* // SELECT 표현식
|
|
34
|
+
* db.user().select((u) => ({
|
|
35
|
+
* name: expr.concat(u.firstName, " ", u.lastName),
|
|
36
|
+
* age: expr.dateDiff("year", u.birthDate, expr.val("DateOnly", DateOnly.today())),
|
|
37
|
+
* }))
|
|
38
|
+
*
|
|
39
|
+
* // 집계 함수
|
|
40
|
+
* db.order().groupBy((o) => o.userId).select((o) => ({
|
|
41
|
+
* userId: o.userId,
|
|
42
|
+
* total: expr.sum(o.amount),
|
|
43
|
+
* }))
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @see {@link Queryable} 쿼리 빌더 클래스
|
|
47
|
+
* @see {@link ExprUnit} 표현식 래퍼 클래스
|
|
48
|
+
*/
|
|
49
|
+
export declare const expr: {
|
|
50
|
+
/**
|
|
51
|
+
* 리터럴 값을 ExprUnit으로 래핑
|
|
52
|
+
*
|
|
53
|
+
* dataType에 맞는 base 타입으로 widening하여 리터럴 타입 제거
|
|
54
|
+
*
|
|
55
|
+
* @param dataType - 값의 데이터 타입 ("string", "number", "boolean", "DateTime", "DateOnly", "Time", "Uuid", "Buffer")
|
|
56
|
+
* @param value - 래핑할 값 (undefined 허용)
|
|
57
|
+
* @returns 래핑된 ExprUnit 인스턴스
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* // 문자열 값
|
|
62
|
+
* expr.val("string", "active")
|
|
63
|
+
*
|
|
64
|
+
* // 숫자 값
|
|
65
|
+
* expr.val("number", 100)
|
|
66
|
+
*
|
|
67
|
+
* // 날짜 값
|
|
68
|
+
* expr.val("DateOnly", DateOnly.today())
|
|
69
|
+
*
|
|
70
|
+
* // undefined 값
|
|
71
|
+
* expr.val("string", undefined)
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
val<TStr extends ColumnPrimitiveStr, T extends ColumnPrimitiveMap[TStr] | undefined>(dataType: TStr, value: T): ExprUnit<T extends undefined ? ColumnPrimitiveMap[TStr] | undefined : ColumnPrimitiveMap[TStr]>;
|
|
75
|
+
/**
|
|
76
|
+
* 컬럼 참조를 생성
|
|
77
|
+
*
|
|
78
|
+
* 일반적으로 Queryable 콜백 내 프록시 객체를 사용하므로 직접 호출할 일이 적음
|
|
79
|
+
*
|
|
80
|
+
* @param dataType - 컬럼의 데이터 타입
|
|
81
|
+
* @param path - 컬럼 경로 (테이블 alias, 컬럼명 등)
|
|
82
|
+
* @returns 컬럼 참조 ExprUnit 인스턴스
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* // 직접 컬럼 참조 (내부용)
|
|
87
|
+
* expr.col("string", "T1", "name")
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
col<TStr extends ColumnPrimitiveStr>(dataType: ColumnPrimitiveStr, ...path: string[]): ExprUnit<ColumnPrimitiveMap[TStr] | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Raw SQL 표현식 생성 (escape hatch)
|
|
93
|
+
*
|
|
94
|
+
* ORM에서 지원하지 않는 DB별 함수나 문법을 직접 사용할 때 사용.
|
|
95
|
+
* 태그 템플릿 리터럴 형식으로 사용하며, 보간된 값은 자동으로 파라미터화됨
|
|
96
|
+
*
|
|
97
|
+
* @param dataType - 반환될 값의 데이터 타입
|
|
98
|
+
* @returns 태그 템플릿 함수
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // MySQL JSON 함수 사용
|
|
103
|
+
* db.user().select((u) => ({
|
|
104
|
+
* name: u.name,
|
|
105
|
+
* data: expr.raw("string")`JSON_EXTRACT(${u.metadata}, '$.email')`,
|
|
106
|
+
* }))
|
|
107
|
+
*
|
|
108
|
+
* // PostgreSQL 배열 함수
|
|
109
|
+
* expr.raw("number")`ARRAY_LENGTH(${u.tags}, 1)`
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
raw<T extends ColumnPrimitiveStr>(dataType: T): (strings: TemplateStringsArray, ...values: ExprInput<ColumnPrimitive>[]) => ExprUnit<ColumnPrimitiveMap[T] | undefined>;
|
|
113
|
+
/**
|
|
114
|
+
* 동등 비교 (NULL-safe)
|
|
115
|
+
*
|
|
116
|
+
* NULL 값도 안전하게 비교 (MySQL: `<=>`, MSSQL/PostgreSQL: `IS NULL OR =`)
|
|
117
|
+
*
|
|
118
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
119
|
+
* @param target - 비교 대상 값 또는 표현식
|
|
120
|
+
* @returns WHERE 조건 표현식
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* db.user().where((u) => [expr.eq(u.status, "active")])
|
|
125
|
+
* // WHERE status <=> 'active' (MySQL)
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
eq<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
129
|
+
/**
|
|
130
|
+
* 초과 비교 (>)
|
|
131
|
+
*
|
|
132
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
133
|
+
* @param target - 비교 대상 값 또는 표현식
|
|
134
|
+
* @returns WHERE 조건 표현식
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* db.user().where((u) => [expr.gt(u.age, 18)])
|
|
139
|
+
* // WHERE age > 18
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
gt<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
143
|
+
/**
|
|
144
|
+
* 미만 비교 (<)
|
|
145
|
+
*
|
|
146
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
147
|
+
* @param target - 비교 대상 값 또는 표현식
|
|
148
|
+
* @returns WHERE 조건 표현식
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* db.user().where((u) => [expr.lt(u.score, 60)])
|
|
153
|
+
* // WHERE score < 60
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
lt<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
157
|
+
/**
|
|
158
|
+
* 이상 비교 (>=)
|
|
159
|
+
*
|
|
160
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
161
|
+
* @param target - 비교 대상 값 또는 표현식
|
|
162
|
+
* @returns WHERE 조건 표현식
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```typescript
|
|
166
|
+
* db.user().where((u) => [expr.gte(u.age, 18)])
|
|
167
|
+
* // WHERE age >= 18
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
gte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
171
|
+
/**
|
|
172
|
+
* 이하 비교 (<=)
|
|
173
|
+
*
|
|
174
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
175
|
+
* @param target - 비교 대상 값 또는 표현식
|
|
176
|
+
* @returns WHERE 조건 표현식
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* db.user().where((u) => [expr.lte(u.score, 100)])
|
|
181
|
+
* // WHERE score <= 100
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
lte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
185
|
+
/**
|
|
186
|
+
* 범위 비교 (BETWEEN)
|
|
187
|
+
*
|
|
188
|
+
* from/to가 undefined이면 해당 방향은 무제한
|
|
189
|
+
*
|
|
190
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
191
|
+
* @param from - 시작 값 (undefined이면 하한 없음)
|
|
192
|
+
* @param to - 끝 값 (undefined이면 상한 없음)
|
|
193
|
+
* @returns WHERE 조건 표현식
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* // 범위 지정
|
|
198
|
+
* db.user().where((u) => [expr.between(u.age, 18, 65)])
|
|
199
|
+
* // WHERE age BETWEEN 18 AND 65
|
|
200
|
+
*
|
|
201
|
+
* // 하한만 지정
|
|
202
|
+
* db.user().where((u) => [expr.between(u.age, 18, undefined)])
|
|
203
|
+
* // WHERE age >= 18
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
between<T extends ColumnPrimitive>(source: ExprUnit<T>, from?: ExprInput<T>, to?: ExprInput<T>): WhereExprUnit;
|
|
207
|
+
/**
|
|
208
|
+
* NULL 체크 (IS NULL)
|
|
209
|
+
*
|
|
210
|
+
* @param source - 체크할 컬럼 또는 표현식
|
|
211
|
+
* @returns WHERE 조건 표현식
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* db.user().where((u) => [expr.null(u.deletedAt)])
|
|
216
|
+
* // WHERE deletedAt IS NULL
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
null<T extends ColumnPrimitive>(source: ExprUnit<T>): WhereExprUnit;
|
|
220
|
+
/**
|
|
221
|
+
* LIKE 패턴 매칭
|
|
222
|
+
*
|
|
223
|
+
* `%`는 0개 이상의 문자, `_`는 단일 문자와 매칭.
|
|
224
|
+
* 특수문자는 `\`로 이스케이프됨
|
|
225
|
+
*
|
|
226
|
+
* @param source - 검색할 컬럼 또는 표현식
|
|
227
|
+
* @param pattern - 검색 패턴 (%, _ 와일드카드 사용 가능)
|
|
228
|
+
* @returns WHERE 조건 표현식
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```typescript
|
|
232
|
+
* // 접두사 검색
|
|
233
|
+
* db.user().where((u) => [expr.like(u.name, "John%")])
|
|
234
|
+
* // WHERE name LIKE 'John%' ESCAPE '\'
|
|
235
|
+
*
|
|
236
|
+
* // 포함 검색
|
|
237
|
+
* db.user().where((u) => [expr.like(u.email, "%@gmail.com")])
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
like(source: ExprUnit<string | undefined>, pattern: ExprInput<string | undefined>): WhereExprUnit;
|
|
241
|
+
/**
|
|
242
|
+
* 정규식 패턴 매칭
|
|
243
|
+
*
|
|
244
|
+
* DBMS별 정규식 문법 차이 주의 필요
|
|
245
|
+
*
|
|
246
|
+
* @param source - 검색할 컬럼 또는 표현식
|
|
247
|
+
* @param pattern - 정규식 패턴
|
|
248
|
+
* @returns WHERE 조건 표현식
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* db.user().where((u) => [expr.regexp(u.email, "^[a-z]+@")])
|
|
253
|
+
* // MySQL: WHERE email REGEXP '^[a-z]+@'
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
regexp(source: ExprUnit<string | undefined>, pattern: ExprInput<string | undefined>): WhereExprUnit;
|
|
257
|
+
/**
|
|
258
|
+
* IN 연산자 - 값 목록과 비교
|
|
259
|
+
*
|
|
260
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
261
|
+
* @param values - 비교할 값 목록
|
|
262
|
+
* @returns WHERE 조건 표현식
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```typescript
|
|
266
|
+
* db.user().where((u) => [expr.in(u.status, ["active", "pending"])])
|
|
267
|
+
* // WHERE status IN ('active', 'pending')
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
in<T extends ColumnPrimitive>(source: ExprUnit<T>, values: ExprInput<T>[]): WhereExprUnit;
|
|
271
|
+
/**
|
|
272
|
+
* IN (SELECT ...) - 서브쿼리 결과와 비교
|
|
273
|
+
*
|
|
274
|
+
* 서브쿼리는 반드시 단일 컬럼만 SELECT해야 함
|
|
275
|
+
*
|
|
276
|
+
* @param source - 비교할 컬럼 또는 표현식
|
|
277
|
+
* @param query - 단일 컬럼을 반환하는 Queryable
|
|
278
|
+
* @returns WHERE 조건 표현식
|
|
279
|
+
* @throws {Error} 서브쿼리가 단일 컬럼이 아닌 경우
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* db.user().where((u) => [
|
|
284
|
+
* expr.inQuery(
|
|
285
|
+
* u.id,
|
|
286
|
+
* db.order()
|
|
287
|
+
* .where((o) => [expr.gt(o.amount, 1000)])
|
|
288
|
+
* .select((o) => ({ userId: o.userId }))
|
|
289
|
+
* ),
|
|
290
|
+
* ])
|
|
291
|
+
* // WHERE id IN (SELECT userId FROM Order WHERE amount > 1000)
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
inQuery<T extends ColumnPrimitive, TData extends Record<string, T>>(source: ExprUnit<T>, query: Queryable<TData, any>): WhereExprUnit;
|
|
295
|
+
/**
|
|
296
|
+
* EXISTS (SELECT ...) - 서브쿼리 결과 존재 여부 확인
|
|
297
|
+
*
|
|
298
|
+
* 서브쿼리가 하나 이상의 행을 반환하면 true
|
|
299
|
+
*
|
|
300
|
+
* @param query - 존재 여부를 확인할 Queryable
|
|
301
|
+
* @returns WHERE 조건 표현식
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* // 주문이 있는 사용자 조회
|
|
306
|
+
* db.user().where((u) => [
|
|
307
|
+
* expr.exists(
|
|
308
|
+
* db.order().where((o) => [expr.eq(o.userId, u.id)])
|
|
309
|
+
* ),
|
|
310
|
+
* ])
|
|
311
|
+
* // WHERE EXISTS (SELECT 1 FROM Order WHERE userId = User.id)
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
exists(query: Queryable<any, any>): WhereExprUnit;
|
|
315
|
+
/**
|
|
316
|
+
* NOT 연산자 - 조건 부정
|
|
317
|
+
*
|
|
318
|
+
* @param arg - 부정할 조건
|
|
319
|
+
* @returns 부정된 WHERE 조건 표현식
|
|
320
|
+
*
|
|
321
|
+
* @example
|
|
322
|
+
* ```typescript
|
|
323
|
+
* db.user().where((u) => [expr.not(expr.eq(u.status, "deleted"))])
|
|
324
|
+
* // WHERE NOT (status <=> 'deleted')
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
not(arg: WhereExprUnit): WhereExprUnit;
|
|
328
|
+
/**
|
|
329
|
+
* AND 연산자 - 모든 조건 충족
|
|
330
|
+
*
|
|
331
|
+
* 여러 조건을 AND로 결합. where() 메서드에 배열로 전달하면 자동으로 AND 적용됨
|
|
332
|
+
*
|
|
333
|
+
* @param conditions - AND로 결합할 조건 목록
|
|
334
|
+
* @returns 결합된 WHERE 조건 표현식
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```typescript
|
|
338
|
+
* db.user().where((u) => [
|
|
339
|
+
* expr.and([
|
|
340
|
+
* expr.eq(u.status, "active"),
|
|
341
|
+
* expr.gte(u.age, 18),
|
|
342
|
+
* ]),
|
|
343
|
+
* ])
|
|
344
|
+
* // WHERE (status <=> 'active' AND age >= 18)
|
|
345
|
+
* ```
|
|
346
|
+
*/
|
|
347
|
+
and(conditions: WhereExprUnit[]): WhereExprUnit;
|
|
348
|
+
/**
|
|
349
|
+
* OR 연산자 - 하나 이상의 조건 충족
|
|
350
|
+
*
|
|
351
|
+
* @param conditions - OR로 결합할 조건 목록
|
|
352
|
+
* @returns 결합된 WHERE 조건 표현식
|
|
353
|
+
*
|
|
354
|
+
* @example
|
|
355
|
+
* ```typescript
|
|
356
|
+
* db.user().where((u) => [
|
|
357
|
+
* expr.or([
|
|
358
|
+
* expr.eq(u.status, "active"),
|
|
359
|
+
* expr.eq(u.status, "pending"),
|
|
360
|
+
* ]),
|
|
361
|
+
* ])
|
|
362
|
+
* // WHERE (status <=> 'active' OR status <=> 'pending')
|
|
363
|
+
* ```
|
|
364
|
+
*/
|
|
365
|
+
or(conditions: WhereExprUnit[]): WhereExprUnit;
|
|
366
|
+
/**
|
|
367
|
+
* 문자열 연결 (CONCAT)
|
|
368
|
+
*
|
|
369
|
+
* NULL 값은 빈 문자열로 처리됨 (DBMS별 자동 변환)
|
|
370
|
+
*
|
|
371
|
+
* @param args - 연결할 문자열들
|
|
372
|
+
* @returns 연결된 문자열 표현식
|
|
373
|
+
*
|
|
374
|
+
* @example
|
|
375
|
+
* ```typescript
|
|
376
|
+
* db.user().select((u) => ({
|
|
377
|
+
* fullName: expr.concat(u.firstName, " ", u.lastName),
|
|
378
|
+
* }))
|
|
379
|
+
* // SELECT CONCAT(firstName, ' ', lastName) AS fullName
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
concat(...args: ExprInput<string | undefined>[]): ExprUnit<string>;
|
|
383
|
+
/**
|
|
384
|
+
* 문자열 왼쪽에서 지정 길이만큼 추출 (LEFT)
|
|
385
|
+
*
|
|
386
|
+
* @param source - 원본 문자열
|
|
387
|
+
* @param length - 추출할 문자 수
|
|
388
|
+
* @returns 추출된 문자열 표현식
|
|
389
|
+
*
|
|
390
|
+
* @example
|
|
391
|
+
* ```typescript
|
|
392
|
+
* db.user().select((u) => ({
|
|
393
|
+
* initial: expr.left(u.name, 1),
|
|
394
|
+
* }))
|
|
395
|
+
* // SELECT LEFT(name, 1) AS initial
|
|
396
|
+
* ```
|
|
397
|
+
*/
|
|
398
|
+
left<T extends string | undefined>(source: ExprUnit<T>, length: ExprInput<number>): ExprUnit<T>;
|
|
399
|
+
/**
|
|
400
|
+
* 문자열 오른쪽에서 지정 길이만큼 추출 (RIGHT)
|
|
401
|
+
*
|
|
402
|
+
* @param source - 원본 문자열
|
|
403
|
+
* @param length - 추출할 문자 수
|
|
404
|
+
* @returns 추출된 문자열 표현식
|
|
405
|
+
*
|
|
406
|
+
* @example
|
|
407
|
+
* ```typescript
|
|
408
|
+
* db.phone().select((p) => ({
|
|
409
|
+
* lastFour: expr.right(p.number, 4),
|
|
410
|
+
* }))
|
|
411
|
+
* // SELECT RIGHT(number, 4) AS lastFour
|
|
412
|
+
* ```
|
|
413
|
+
*/
|
|
414
|
+
right<T extends string | undefined>(source: ExprUnit<T>, length: ExprInput<number>): ExprUnit<T>;
|
|
415
|
+
/**
|
|
416
|
+
* 문자열 양쪽 공백 제거 (TRIM)
|
|
417
|
+
*
|
|
418
|
+
* @param source - 원본 문자열
|
|
419
|
+
* @returns 공백이 제거된 문자열 표현식
|
|
420
|
+
*
|
|
421
|
+
* @example
|
|
422
|
+
* ```typescript
|
|
423
|
+
* db.user().select((u) => ({
|
|
424
|
+
* name: expr.trim(u.name),
|
|
425
|
+
* }))
|
|
426
|
+
* // SELECT TRIM(name) AS name
|
|
427
|
+
* ```
|
|
428
|
+
*/
|
|
429
|
+
trim<T extends string | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
430
|
+
/**
|
|
431
|
+
* 문자열 왼쪽 패딩 (LPAD)
|
|
432
|
+
*
|
|
433
|
+
* 지정 길이가 될 때까지 왼쪽에 fillString 반복 추가
|
|
434
|
+
*
|
|
435
|
+
* @param source - 원본 문자열
|
|
436
|
+
* @param length - 목표 길이
|
|
437
|
+
* @param fillString - 패딩에 사용할 문자열
|
|
438
|
+
* @returns 패딩된 문자열 표현식
|
|
439
|
+
*
|
|
440
|
+
* @example
|
|
441
|
+
* ```typescript
|
|
442
|
+
* db.order().select((o) => ({
|
|
443
|
+
* orderNo: expr.padStart(expr.cast(o.id, { type: "varchar", length: 10 }), 8, "0"),
|
|
444
|
+
* }))
|
|
445
|
+
* // SELECT LPAD(CAST(id AS VARCHAR(10)), 8, '0') AS orderNo
|
|
446
|
+
* // 결과: "00000123"
|
|
447
|
+
* ```
|
|
448
|
+
*/
|
|
449
|
+
padStart<T extends string | undefined>(source: ExprUnit<T>, length: ExprInput<number>, fillString: ExprInput<string>): ExprUnit<T>;
|
|
450
|
+
/**
|
|
451
|
+
* 문자열 치환 (REPLACE)
|
|
452
|
+
*
|
|
453
|
+
* @param source - 원본 문자열
|
|
454
|
+
* @param from - 찾을 문자열
|
|
455
|
+
* @param to - 대체할 문자열
|
|
456
|
+
* @returns 치환된 문자열 표현식
|
|
457
|
+
*
|
|
458
|
+
* @example
|
|
459
|
+
* ```typescript
|
|
460
|
+
* db.user().select((u) => ({
|
|
461
|
+
* phone: expr.replace(u.phone, "-", ""),
|
|
462
|
+
* }))
|
|
463
|
+
* // SELECT REPLACE(phone, '-', '') AS phone
|
|
464
|
+
* ```
|
|
465
|
+
*/
|
|
466
|
+
replace<T extends string | undefined>(source: ExprUnit<T>, from: ExprInput<string>, to: ExprInput<string>): ExprUnit<T>;
|
|
467
|
+
/**
|
|
468
|
+
* 문자열 대문자 변환 (UPPER)
|
|
469
|
+
*
|
|
470
|
+
* @param source - 원본 문자열
|
|
471
|
+
* @returns 대문자로 변환된 문자열 표현식
|
|
472
|
+
*
|
|
473
|
+
* @example
|
|
474
|
+
* ```typescript
|
|
475
|
+
* db.user().select((u) => ({
|
|
476
|
+
* code: expr.upper(u.code),
|
|
477
|
+
* }))
|
|
478
|
+
* // SELECT UPPER(code) AS code
|
|
479
|
+
* ```
|
|
480
|
+
*/
|
|
481
|
+
upper<T extends string | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
482
|
+
/**
|
|
483
|
+
* 문자열 소문자 변환 (LOWER)
|
|
484
|
+
*
|
|
485
|
+
* @param source - 원본 문자열
|
|
486
|
+
* @returns 소문자로 변환된 문자열 표현식
|
|
487
|
+
*
|
|
488
|
+
* @example
|
|
489
|
+
* ```typescript
|
|
490
|
+
* db.user().select((u) => ({
|
|
491
|
+
* email: expr.lower(u.email),
|
|
492
|
+
* }))
|
|
493
|
+
* // SELECT LOWER(email) AS email
|
|
494
|
+
* ```
|
|
495
|
+
*/
|
|
496
|
+
lower<T extends string | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
497
|
+
/**
|
|
498
|
+
* 문자열 길이 (문자 수)
|
|
499
|
+
*
|
|
500
|
+
* @param source - 원본 문자열
|
|
501
|
+
* @returns 문자 수
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```typescript
|
|
505
|
+
* db.user().select((u) => ({
|
|
506
|
+
* nameLength: expr.length(u.name),
|
|
507
|
+
* }))
|
|
508
|
+
* // SELECT CHAR_LENGTH(name) AS nameLength
|
|
509
|
+
* ```
|
|
510
|
+
*/
|
|
511
|
+
length(source: ExprUnit<string | undefined>): ExprUnit<number>;
|
|
512
|
+
/**
|
|
513
|
+
* 문자열 바이트 길이
|
|
514
|
+
*
|
|
515
|
+
* UTF-8 환경에서 한글은 3바이트
|
|
516
|
+
*
|
|
517
|
+
* @param source - 원본 문자열
|
|
518
|
+
* @returns 바이트 수
|
|
519
|
+
*
|
|
520
|
+
* @example
|
|
521
|
+
* ```typescript
|
|
522
|
+
* db.user().select((u) => ({
|
|
523
|
+
* byteLen: expr.byteLength(u.name),
|
|
524
|
+
* }))
|
|
525
|
+
* // SELECT OCTET_LENGTH(name) AS byteLen
|
|
526
|
+
* ```
|
|
527
|
+
*/
|
|
528
|
+
byteLength(source: ExprUnit<string | undefined>): ExprUnit<number>;
|
|
529
|
+
/**
|
|
530
|
+
* 문자열 일부 추출 (SUBSTRING)
|
|
531
|
+
*
|
|
532
|
+
* SQL 표준에 따라 1-based index 사용
|
|
533
|
+
*
|
|
534
|
+
* @param source - 원본 문자열
|
|
535
|
+
* @param start - 시작 위치 (1부터 시작)
|
|
536
|
+
* @param length - 추출할 길이 (생략 시 끝까지)
|
|
537
|
+
* @returns 추출된 문자열 표현식
|
|
538
|
+
*
|
|
539
|
+
* @example
|
|
540
|
+
* ```typescript
|
|
541
|
+
* db.user().select((u) => ({
|
|
542
|
+
* // "Hello World"에서 인덱스 1부터 5글자: "Hello"
|
|
543
|
+
* prefix: expr.substring(u.name, 1, 5),
|
|
544
|
+
* }))
|
|
545
|
+
* // SELECT SUBSTRING(name, 1, 5) AS prefix
|
|
546
|
+
* ```
|
|
547
|
+
*/
|
|
548
|
+
substring<T extends string | undefined>(source: ExprUnit<T>, start: ExprInput<number>, length?: ExprInput<number>): ExprUnit<T>;
|
|
549
|
+
/**
|
|
550
|
+
* 문자열 내 위치 찾기 (LOCATE/CHARINDEX)
|
|
551
|
+
*
|
|
552
|
+
* 1-based index 반환, 없으면 0 반환
|
|
553
|
+
*
|
|
554
|
+
* @param source - 검색할 문자열
|
|
555
|
+
* @param search - 찾을 문자열
|
|
556
|
+
* @returns 위치 (1부터 시작, 없으면 0)
|
|
557
|
+
*
|
|
558
|
+
* @example
|
|
559
|
+
* ```typescript
|
|
560
|
+
* db.user().select((u) => ({
|
|
561
|
+
* atPos: expr.indexOf(u.email, "@"),
|
|
562
|
+
* }))
|
|
563
|
+
* // SELECT LOCATE('@', email) AS atPos (MySQL)
|
|
564
|
+
* // "john@example.com" → 5
|
|
565
|
+
* ```
|
|
566
|
+
*/
|
|
567
|
+
indexOf(source: ExprUnit<string | undefined>, search: ExprInput<string>): ExprUnit<number>;
|
|
568
|
+
/**
|
|
569
|
+
* 절대값 (ABS)
|
|
570
|
+
*
|
|
571
|
+
* @param source - 원본 숫자
|
|
572
|
+
* @returns 절대값 표현식
|
|
573
|
+
*
|
|
574
|
+
* @example
|
|
575
|
+
* ```typescript
|
|
576
|
+
* db.account().select((a) => ({
|
|
577
|
+
* balance: expr.abs(a.balance),
|
|
578
|
+
* }))
|
|
579
|
+
* // SELECT ABS(balance) AS balance
|
|
580
|
+
* ```
|
|
581
|
+
*/
|
|
582
|
+
abs<T extends number | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
583
|
+
/**
|
|
584
|
+
* 반올림 (ROUND)
|
|
585
|
+
*
|
|
586
|
+
* @param source - 원본 숫자
|
|
587
|
+
* @param digits - 소수점 이하 자릿수
|
|
588
|
+
* @returns 반올림된 숫자 표현식
|
|
589
|
+
*
|
|
590
|
+
* @example
|
|
591
|
+
* ```typescript
|
|
592
|
+
* db.product().select((p) => ({
|
|
593
|
+
* price: expr.round(p.price, 2),
|
|
594
|
+
* }))
|
|
595
|
+
* // SELECT ROUND(price, 2) AS price
|
|
596
|
+
* // 123.456 → 123.46
|
|
597
|
+
* ```
|
|
598
|
+
*/
|
|
599
|
+
round<T extends number | undefined>(source: ExprUnit<T>, digits: number): ExprUnit<T>;
|
|
600
|
+
/**
|
|
601
|
+
* 올림 (CEILING)
|
|
602
|
+
*
|
|
603
|
+
* @param source - 원본 숫자
|
|
604
|
+
* @returns 올림된 숫자 표현식
|
|
605
|
+
*
|
|
606
|
+
* @example
|
|
607
|
+
* ```typescript
|
|
608
|
+
* db.order().select((o) => ({
|
|
609
|
+
* pages: expr.ceil(expr.divide(o.itemCount, 10)),
|
|
610
|
+
* }))
|
|
611
|
+
* // SELECT CEILING(itemCount / 10) AS pages
|
|
612
|
+
* // 25 / 10 = 2.5 → 3
|
|
613
|
+
* ```
|
|
614
|
+
*/
|
|
615
|
+
ceil<T extends number | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
616
|
+
/**
|
|
617
|
+
* 버림 (FLOOR)
|
|
618
|
+
*
|
|
619
|
+
* @param source - 원본 숫자
|
|
620
|
+
* @returns 버림된 숫자 표현식
|
|
621
|
+
*
|
|
622
|
+
* @example
|
|
623
|
+
* ```typescript
|
|
624
|
+
* db.user().select((u) => ({
|
|
625
|
+
* ageGroup: expr.floor(expr.divide(u.age, 10)),
|
|
626
|
+
* }))
|
|
627
|
+
* // SELECT FLOOR(age / 10) AS ageGroup
|
|
628
|
+
* // 25 / 10 = 2.5 → 2
|
|
629
|
+
* ```
|
|
630
|
+
*/
|
|
631
|
+
floor<T extends number | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
632
|
+
/**
|
|
633
|
+
* 연도 추출 (YEAR)
|
|
634
|
+
*
|
|
635
|
+
* @param source - DateTime 또는 DateOnly 표현식
|
|
636
|
+
* @returns 연도 (4자리 숫자)
|
|
637
|
+
*
|
|
638
|
+
* @example
|
|
639
|
+
* ```typescript
|
|
640
|
+
* db.user().select((u) => ({
|
|
641
|
+
* birthYear: expr.year(u.birthDate),
|
|
642
|
+
* }))
|
|
643
|
+
* // SELECT YEAR(birthDate) AS birthYear
|
|
644
|
+
* ```
|
|
645
|
+
*/
|
|
646
|
+
year<T extends DateTime | DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
647
|
+
/**
|
|
648
|
+
* 월 추출 (MONTH)
|
|
649
|
+
*
|
|
650
|
+
* @param source - DateTime 또는 DateOnly 표현식
|
|
651
|
+
* @returns 월 (1~12)
|
|
652
|
+
*
|
|
653
|
+
* @example
|
|
654
|
+
* ```typescript
|
|
655
|
+
* db.order().select((o) => ({
|
|
656
|
+
* orderMonth: expr.month(o.createdAt),
|
|
657
|
+
* }))
|
|
658
|
+
* // SELECT MONTH(createdAt) AS orderMonth
|
|
659
|
+
* ```
|
|
660
|
+
*/
|
|
661
|
+
month<T extends DateTime | DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
662
|
+
/**
|
|
663
|
+
* 일 추출 (DAY)
|
|
664
|
+
*
|
|
665
|
+
* @param source - DateTime 또는 DateOnly 표현식
|
|
666
|
+
* @returns 일 (1~31)
|
|
667
|
+
*
|
|
668
|
+
* @example
|
|
669
|
+
* ```typescript
|
|
670
|
+
* db.user().select((u) => ({
|
|
671
|
+
* birthDay: expr.day(u.birthDate),
|
|
672
|
+
* }))
|
|
673
|
+
* // SELECT DAY(birthDate) AS birthDay
|
|
674
|
+
* ```
|
|
675
|
+
*/
|
|
676
|
+
day<T extends DateTime | DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
677
|
+
/**
|
|
678
|
+
* 시 추출 (HOUR)
|
|
679
|
+
*
|
|
680
|
+
* @param source - DateTime 또는 Time 표현식
|
|
681
|
+
* @returns 시 (0~23)
|
|
682
|
+
*
|
|
683
|
+
* @example
|
|
684
|
+
* ```typescript
|
|
685
|
+
* db.log().select((l) => ({
|
|
686
|
+
* logHour: expr.hour(l.createdAt),
|
|
687
|
+
* }))
|
|
688
|
+
* // SELECT HOUR(createdAt) AS logHour
|
|
689
|
+
* ```
|
|
690
|
+
*/
|
|
691
|
+
hour<T extends DateTime | Time | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
692
|
+
/**
|
|
693
|
+
* 분 추출 (MINUTE)
|
|
694
|
+
*
|
|
695
|
+
* @param source - DateTime 또는 Time 표현식
|
|
696
|
+
* @returns 분 (0~59)
|
|
697
|
+
*
|
|
698
|
+
* @example
|
|
699
|
+
* ```typescript
|
|
700
|
+
* db.log().select((l) => ({
|
|
701
|
+
* logMinute: expr.minute(l.createdAt),
|
|
702
|
+
* }))
|
|
703
|
+
* // SELECT MINUTE(createdAt) AS logMinute
|
|
704
|
+
* ```
|
|
705
|
+
*/
|
|
706
|
+
minute<T extends DateTime | Time | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
707
|
+
/**
|
|
708
|
+
* 초 추출 (SECOND)
|
|
709
|
+
*
|
|
710
|
+
* @param source - DateTime 또는 Time 표현식
|
|
711
|
+
* @returns 초 (0~59)
|
|
712
|
+
*
|
|
713
|
+
* @example
|
|
714
|
+
* ```typescript
|
|
715
|
+
* db.log().select((l) => ({
|
|
716
|
+
* logSecond: expr.second(l.createdAt),
|
|
717
|
+
* }))
|
|
718
|
+
* // SELECT SECOND(createdAt) AS logSecond
|
|
719
|
+
* ```
|
|
720
|
+
*/
|
|
721
|
+
second<T extends DateTime | Time | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
722
|
+
/**
|
|
723
|
+
* ISO 주차 추출
|
|
724
|
+
*
|
|
725
|
+
* ISO 8601 기준 주차 (월요일 시작, 1~53)
|
|
726
|
+
*
|
|
727
|
+
* @param source - DateOnly 표현식
|
|
728
|
+
* @returns ISO 주차 번호
|
|
729
|
+
*
|
|
730
|
+
* @example
|
|
731
|
+
* ```typescript
|
|
732
|
+
* db.order().select((o) => ({
|
|
733
|
+
* weekNum: expr.isoWeek(o.orderDate),
|
|
734
|
+
* }))
|
|
735
|
+
* // SELECT WEEK(orderDate, 3) AS weekNum (MySQL)
|
|
736
|
+
* ```
|
|
737
|
+
*/
|
|
738
|
+
isoWeek<T extends DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
739
|
+
/**
|
|
740
|
+
* ISO 주 시작일 (월요일)
|
|
741
|
+
*
|
|
742
|
+
* 해당 날짜가 속한 주의 월요일 반환
|
|
743
|
+
*
|
|
744
|
+
* @param source - DateOnly 표현식
|
|
745
|
+
* @returns 주의 시작 날짜 (월요일)
|
|
746
|
+
*
|
|
747
|
+
* @example
|
|
748
|
+
* ```typescript
|
|
749
|
+
* db.order().select((o) => ({
|
|
750
|
+
* weekStart: expr.isoWeekStartDate(o.orderDate),
|
|
751
|
+
* }))
|
|
752
|
+
* // 2024-01-10 (수) → 2024-01-08 (월)
|
|
753
|
+
* ```
|
|
754
|
+
*/
|
|
755
|
+
isoWeekStartDate<T extends DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
756
|
+
/**
|
|
757
|
+
* ISO 연월 (해당 월의 1일)
|
|
758
|
+
*
|
|
759
|
+
* 해당 날짜의 월 첫째 날 반환
|
|
760
|
+
*
|
|
761
|
+
* @param source - DateOnly 표현식
|
|
762
|
+
* @returns 월의 첫째 날
|
|
763
|
+
*
|
|
764
|
+
* @example
|
|
765
|
+
* ```typescript
|
|
766
|
+
* db.order().select((o) => ({
|
|
767
|
+
* yearMonth: expr.isoYearMonth(o.orderDate),
|
|
768
|
+
* }))
|
|
769
|
+
* // 2024-01-15 → 2024-01-01
|
|
770
|
+
* ```
|
|
771
|
+
*/
|
|
772
|
+
isoYearMonth<T extends DateOnly | undefined>(source: ExprUnit<T>): ExprUnit<T>;
|
|
773
|
+
/**
|
|
774
|
+
* 날짜 차이 계산 (DATEDIFF)
|
|
775
|
+
*
|
|
776
|
+
* @param separator - 단위 ("year", "month", "day", "hour", "minute", "second")
|
|
777
|
+
* @param from - 시작 날짜
|
|
778
|
+
* @param to - 끝 날짜
|
|
779
|
+
* @returns 차이 값 (to - from)
|
|
780
|
+
*
|
|
781
|
+
* @example
|
|
782
|
+
* ```typescript
|
|
783
|
+
* db.user().select((u) => ({
|
|
784
|
+
* age: expr.dateDiff("year", u.birthDate, expr.val("DateOnly", DateOnly.today())),
|
|
785
|
+
* }))
|
|
786
|
+
* // SELECT DATEDIFF(year, birthDate, '2024-01-15') AS age
|
|
787
|
+
* ```
|
|
788
|
+
*/
|
|
789
|
+
dateDiff<T extends DateTime | DateOnly | Time | undefined>(separator: DateSeparator, from: ExprInput<T>, to: ExprInput<T>): ExprUnit<T extends undefined ? undefined : number>;
|
|
790
|
+
/**
|
|
791
|
+
* 날짜 더하기 (DATEADD)
|
|
792
|
+
*
|
|
793
|
+
* @param separator - 단위 ("year", "month", "day", "hour", "minute", "second")
|
|
794
|
+
* @param source - 원본 날짜
|
|
795
|
+
* @param value - 더할 값 (음수 가능)
|
|
796
|
+
* @returns 계산된 날짜
|
|
797
|
+
*
|
|
798
|
+
* @example
|
|
799
|
+
* ```typescript
|
|
800
|
+
* db.subscription().select((s) => ({
|
|
801
|
+
* expiresAt: expr.dateAdd("month", s.startDate, 12),
|
|
802
|
+
* }))
|
|
803
|
+
* // SELECT DATEADD(month, 12, startDate) AS expiresAt
|
|
804
|
+
* ```
|
|
805
|
+
*/
|
|
806
|
+
dateAdd<T extends DateTime | DateOnly | Time | undefined>(separator: DateSeparator, source: ExprUnit<T>, value: ExprInput<number>): ExprUnit<T>;
|
|
807
|
+
/**
|
|
808
|
+
* 날짜 포맷 (DATE_FORMAT)
|
|
809
|
+
*
|
|
810
|
+
* DBMS별로 포맷 문자열 규칙이 다를 수 있음
|
|
811
|
+
*
|
|
812
|
+
* @param source - 날짜 표현식
|
|
813
|
+
* @param format - 포맷 문자열 (예: "%Y-%m-%d")
|
|
814
|
+
* @returns 포맷된 문자열 표현식
|
|
815
|
+
*
|
|
816
|
+
* @example
|
|
817
|
+
* ```typescript
|
|
818
|
+
* db.order().select((o) => ({
|
|
819
|
+
* orderDate: expr.formatDate(o.createdAt, "%Y-%m-%d"),
|
|
820
|
+
* }))
|
|
821
|
+
* // SELECT DATE_FORMAT(createdAt, '%Y-%m-%d') AS orderDate (MySQL)
|
|
822
|
+
* // 2024-01-15 10:30:00 → "2024-01-15"
|
|
823
|
+
* ```
|
|
824
|
+
*/
|
|
825
|
+
formatDate<T extends DateTime | DateOnly | Time | undefined>(source: ExprUnit<T>, format: string): ExprUnit<T extends undefined ? undefined : string>;
|
|
826
|
+
/**
|
|
827
|
+
* NULL 대체 (COALESCE/IFNULL)
|
|
828
|
+
*
|
|
829
|
+
* 첫 번째 non-null 값을 반환. 마지막 인자가 non-nullable이면 결과도 non-nullable
|
|
830
|
+
*
|
|
831
|
+
* @param args - 검사할 값들 (마지막은 기본값)
|
|
832
|
+
* @returns 첫 번째 non-null 값
|
|
833
|
+
*
|
|
834
|
+
* @example
|
|
835
|
+
* ```typescript
|
|
836
|
+
* db.user().select((u) => ({
|
|
837
|
+
* displayName: expr.ifNull(u.nickname, u.name, "Guest"),
|
|
838
|
+
* }))
|
|
839
|
+
* // SELECT COALESCE(nickname, name, 'Guest') AS displayName
|
|
840
|
+
* ```
|
|
841
|
+
*/
|
|
842
|
+
ifNull: typeof ifNull;
|
|
843
|
+
/**
|
|
844
|
+
* 특정 값이면 NULL 반환 (NULLIF)
|
|
845
|
+
*
|
|
846
|
+
* source === value 이면 NULL 반환, 아니면 source 반환
|
|
847
|
+
*
|
|
848
|
+
* @param source - 원본 값
|
|
849
|
+
* @param value - 비교할 값
|
|
850
|
+
* @returns NULL 또는 원본 값
|
|
851
|
+
*
|
|
852
|
+
* @example
|
|
853
|
+
* ```typescript
|
|
854
|
+
* db.user().select((u) => ({
|
|
855
|
+
* // 빈 문자열을 NULL로 변환
|
|
856
|
+
* bio: expr.nullIf(u.bio, ""),
|
|
857
|
+
* }))
|
|
858
|
+
* // SELECT NULLIF(bio, '') AS bio
|
|
859
|
+
* ```
|
|
860
|
+
*/
|
|
861
|
+
nullIf<T extends ColumnPrimitive>(source: ExprUnit<T>, value: ExprInput<T>): ExprUnit<T | undefined>;
|
|
862
|
+
/**
|
|
863
|
+
* WHERE 표현식을 boolean으로 변환
|
|
864
|
+
*
|
|
865
|
+
* SELECT 절에서 조건 결과를 boolean 컬럼으로 사용할 때 사용
|
|
866
|
+
*
|
|
867
|
+
* @param condition - 변환할 조건
|
|
868
|
+
* @returns boolean 표현식
|
|
869
|
+
*
|
|
870
|
+
* @example
|
|
871
|
+
* ```typescript
|
|
872
|
+
* db.user().select((u) => ({
|
|
873
|
+
* isActive: expr.is(expr.eq(u.status, "active")),
|
|
874
|
+
* }))
|
|
875
|
+
* // SELECT (status <=> 'active') AS isActive
|
|
876
|
+
* ```
|
|
877
|
+
*/
|
|
878
|
+
is(condition: WhereExprUnit): ExprUnit<boolean>;
|
|
879
|
+
/**
|
|
880
|
+
* CASE WHEN 표현식 빌더
|
|
881
|
+
*
|
|
882
|
+
* 체이닝 방식으로 조건 분기를 구성
|
|
883
|
+
*
|
|
884
|
+
* @returns SwitchExprBuilder 인스턴스
|
|
885
|
+
*
|
|
886
|
+
* @example
|
|
887
|
+
* ```typescript
|
|
888
|
+
* db.user().select((u) => ({
|
|
889
|
+
* grade: expr.switch<string>()
|
|
890
|
+
* .case(expr.gte(u.score, 90), "A")
|
|
891
|
+
* .case(expr.gte(u.score, 80), "B")
|
|
892
|
+
* .case(expr.gte(u.score, 70), "C")
|
|
893
|
+
* .default("F"),
|
|
894
|
+
* }))
|
|
895
|
+
* // SELECT CASE WHEN score >= 90 THEN 'A' ... ELSE 'F' END AS grade
|
|
896
|
+
* ```
|
|
897
|
+
*/
|
|
898
|
+
switch<T extends ColumnPrimitive>(): SwitchExprBuilder<T>;
|
|
899
|
+
/**
|
|
900
|
+
* 단순 IF 조건 (삼항 연산자)
|
|
901
|
+
*
|
|
902
|
+
* @param condition - 조건
|
|
903
|
+
* @param then - 조건이 참일 때 값
|
|
904
|
+
* @param else_ - 조건이 거짓일 때 값
|
|
905
|
+
* @returns 조건부 값 표현식
|
|
906
|
+
*
|
|
907
|
+
* @example
|
|
908
|
+
* ```typescript
|
|
909
|
+
* db.user().select((u) => ({
|
|
910
|
+
* type: expr.if(expr.gte(u.age, 18), "adult", "minor"),
|
|
911
|
+
* }))
|
|
912
|
+
* // SELECT IF(age >= 18, 'adult', 'minor') AS type
|
|
913
|
+
* ```
|
|
914
|
+
*/
|
|
915
|
+
if<T extends ColumnPrimitive>(condition: WhereExprUnit, then: ExprInput<T>, else_: ExprInput<T>): ExprUnit<T>;
|
|
916
|
+
/**
|
|
917
|
+
* 행 수 카운트 (COUNT)
|
|
918
|
+
*
|
|
919
|
+
* @param arg - 카운트할 컬럼 (생략 시 전체 행 수)
|
|
920
|
+
* @param distinct - true면 중복 제거
|
|
921
|
+
* @returns 행 수
|
|
922
|
+
*
|
|
923
|
+
* @example
|
|
924
|
+
* ```typescript
|
|
925
|
+
* // 전체 행 수
|
|
926
|
+
* db.user().select(() => ({ total: expr.count() }))
|
|
927
|
+
*
|
|
928
|
+
* // 중복 제거 카운트
|
|
929
|
+
* db.order().select((o) => ({
|
|
930
|
+
* uniqueCustomers: expr.count(o.customerId, true),
|
|
931
|
+
* }))
|
|
932
|
+
* ```
|
|
933
|
+
*/
|
|
934
|
+
count(arg?: ExprUnit<ColumnPrimitive>, distinct?: boolean): ExprUnit<number>;
|
|
935
|
+
/**
|
|
936
|
+
* 합계 (SUM)
|
|
937
|
+
*
|
|
938
|
+
* NULL 값은 무시됨. 모든 값이 NULL이면 NULL 반환
|
|
939
|
+
*
|
|
940
|
+
* @param arg - 합계를 구할 숫자 컬럼
|
|
941
|
+
* @returns 합계 (또는 NULL)
|
|
942
|
+
*
|
|
943
|
+
* @example
|
|
944
|
+
* ```typescript
|
|
945
|
+
* db.order().groupBy((o) => o.userId).select((o) => ({
|
|
946
|
+
* userId: o.userId,
|
|
947
|
+
* totalAmount: expr.sum(o.amount),
|
|
948
|
+
* }))
|
|
949
|
+
* ```
|
|
950
|
+
*/
|
|
951
|
+
sum(arg: ExprUnit<number | undefined>): ExprUnit<number | undefined>;
|
|
952
|
+
/**
|
|
953
|
+
* 평균 (AVG)
|
|
954
|
+
*
|
|
955
|
+
* NULL 값은 무시됨. 모든 값이 NULL이면 NULL 반환
|
|
956
|
+
*
|
|
957
|
+
* @param arg - 평균을 구할 숫자 컬럼
|
|
958
|
+
* @returns 평균 (또는 NULL)
|
|
959
|
+
*
|
|
960
|
+
* @example
|
|
961
|
+
* ```typescript
|
|
962
|
+
* db.product().groupBy((p) => p.categoryId).select((p) => ({
|
|
963
|
+
* categoryId: p.categoryId,
|
|
964
|
+
* avgPrice: expr.avg(p.price),
|
|
965
|
+
* }))
|
|
966
|
+
* ```
|
|
967
|
+
*/
|
|
968
|
+
avg(arg: ExprUnit<number | undefined>): ExprUnit<number | undefined>;
|
|
969
|
+
/**
|
|
970
|
+
* 최대값 (MAX)
|
|
971
|
+
*
|
|
972
|
+
* NULL 값은 무시됨. 모든 값이 NULL이면 NULL 반환
|
|
973
|
+
*
|
|
974
|
+
* @param arg - 최대값을 구할 컬럼
|
|
975
|
+
* @returns 최대값 (또는 NULL)
|
|
976
|
+
*
|
|
977
|
+
* @example
|
|
978
|
+
* ```typescript
|
|
979
|
+
* db.order().groupBy((o) => o.userId).select((o) => ({
|
|
980
|
+
* userId: o.userId,
|
|
981
|
+
* lastOrderDate: expr.max(o.createdAt),
|
|
982
|
+
* }))
|
|
983
|
+
* ```
|
|
984
|
+
*/
|
|
985
|
+
max<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T | undefined>;
|
|
986
|
+
/**
|
|
987
|
+
* 최소값 (MIN)
|
|
988
|
+
*
|
|
989
|
+
* NULL 값은 무시됨. 모든 값이 NULL이면 NULL 반환
|
|
990
|
+
*
|
|
991
|
+
* @param arg - 최소값을 구할 컬럼
|
|
992
|
+
* @returns 최소값 (또는 NULL)
|
|
993
|
+
*
|
|
994
|
+
* @example
|
|
995
|
+
* ```typescript
|
|
996
|
+
* db.product().groupBy((p) => p.categoryId).select((p) => ({
|
|
997
|
+
* categoryId: p.categoryId,
|
|
998
|
+
* minPrice: expr.min(p.price),
|
|
999
|
+
* }))
|
|
1000
|
+
* ```
|
|
1001
|
+
*/
|
|
1002
|
+
min<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T | undefined>;
|
|
1003
|
+
/**
|
|
1004
|
+
* 여러 값 중 최대값 (GREATEST)
|
|
1005
|
+
*
|
|
1006
|
+
* @param args - 비교할 값들
|
|
1007
|
+
* @returns 최대값
|
|
1008
|
+
*
|
|
1009
|
+
* @example
|
|
1010
|
+
* ```typescript
|
|
1011
|
+
* db.product().select((p) => ({
|
|
1012
|
+
* effectivePrice: expr.greatest(p.price, p.minPrice),
|
|
1013
|
+
* }))
|
|
1014
|
+
* // SELECT GREATEST(price, minPrice) AS effectivePrice
|
|
1015
|
+
* ```
|
|
1016
|
+
*/
|
|
1017
|
+
greatest<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
|
|
1018
|
+
/**
|
|
1019
|
+
* 여러 값 중 최소값 (LEAST)
|
|
1020
|
+
*
|
|
1021
|
+
* @param args - 비교할 값들
|
|
1022
|
+
* @returns 최소값
|
|
1023
|
+
*
|
|
1024
|
+
* @example
|
|
1025
|
+
* ```typescript
|
|
1026
|
+
* db.product().select((p) => ({
|
|
1027
|
+
* effectivePrice: expr.least(p.price, p.maxDiscount),
|
|
1028
|
+
* }))
|
|
1029
|
+
* // SELECT LEAST(price, maxDiscount) AS effectivePrice
|
|
1030
|
+
* ```
|
|
1031
|
+
*/
|
|
1032
|
+
least<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
|
|
1033
|
+
/**
|
|
1034
|
+
* 행 번호 (ROW_NUMBER 없이 전체 행에 대한 순번)
|
|
1035
|
+
*
|
|
1036
|
+
* @returns 행 번호 (1부터 시작)
|
|
1037
|
+
*
|
|
1038
|
+
* @example
|
|
1039
|
+
* ```typescript
|
|
1040
|
+
* db.user().select((u) => ({
|
|
1041
|
+
* rowNum: expr.rowNum(),
|
|
1042
|
+
* name: u.name,
|
|
1043
|
+
* }))
|
|
1044
|
+
* ```
|
|
1045
|
+
*/
|
|
1046
|
+
rowNum(): ExprUnit<number>;
|
|
1047
|
+
/**
|
|
1048
|
+
* 난수 생성 (RAND/RANDOM)
|
|
1049
|
+
*
|
|
1050
|
+
* 0~1 사이의 난수 반환. ORDER BY에서 랜덤 정렬용으로 주로 사용
|
|
1051
|
+
*
|
|
1052
|
+
* @returns 0~1 사이의 난수
|
|
1053
|
+
*
|
|
1054
|
+
* @example
|
|
1055
|
+
* ```typescript
|
|
1056
|
+
* // 랜덤 정렬
|
|
1057
|
+
* db.user().orderBy(() => expr.random()).limit(10)
|
|
1058
|
+
* ```
|
|
1059
|
+
*/
|
|
1060
|
+
random(): ExprUnit<number>;
|
|
1061
|
+
/**
|
|
1062
|
+
* 타입 변환 (CAST)
|
|
1063
|
+
*
|
|
1064
|
+
* @param source - 변환할 표현식
|
|
1065
|
+
* @param targetType - 대상 데이터 타입
|
|
1066
|
+
* @returns 변환된 표현식
|
|
1067
|
+
*
|
|
1068
|
+
* @example
|
|
1069
|
+
* ```typescript
|
|
1070
|
+
* db.order().select((o) => ({
|
|
1071
|
+
* idStr: expr.cast(o.id, { type: "varchar", length: 20 }),
|
|
1072
|
+
* }))
|
|
1073
|
+
* // SELECT CAST(id AS VARCHAR(20)) AS idStr
|
|
1074
|
+
* ```
|
|
1075
|
+
*/
|
|
1076
|
+
cast<T extends ColumnPrimitive, TDataType extends DataType>(source: ExprUnit<T>, targetType: TDataType): ExprUnit<T extends undefined ? undefined : InferColumnPrimitiveFromDataType<TDataType>>;
|
|
1077
|
+
/**
|
|
1078
|
+
* 스칼라 서브쿼리 - SELECT 절에서 단일 값 반환 서브쿼리
|
|
1079
|
+
*
|
|
1080
|
+
* 서브쿼리는 반드시 단일 행, 단일 컬럼을 반환해야 함
|
|
1081
|
+
*
|
|
1082
|
+
* @param dataType - 반환될 값의 데이터 타입
|
|
1083
|
+
* @param queryable - 스칼라 값을 반환하는 Queryable
|
|
1084
|
+
* @returns 서브쿼리 결과 표현식
|
|
1085
|
+
*
|
|
1086
|
+
* @example
|
|
1087
|
+
* ```typescript
|
|
1088
|
+
* db.user().select((u) => ({
|
|
1089
|
+
* id: u.id,
|
|
1090
|
+
* postCount: expr.subquery(
|
|
1091
|
+
* "number",
|
|
1092
|
+
* db.post()
|
|
1093
|
+
* .where((p) => [expr.eq(p.userId, u.id)])
|
|
1094
|
+
* .select(() => ({ cnt: expr.count() }))
|
|
1095
|
+
* ),
|
|
1096
|
+
* }))
|
|
1097
|
+
* // SELECT id, (SELECT COUNT(*) FROM Post WHERE userId = User.id) AS postCount
|
|
1098
|
+
* ```
|
|
1099
|
+
*/
|
|
1100
|
+
subquery<TStr extends ColumnPrimitiveStr>(dataType: TStr, queryable: {
|
|
1101
|
+
getSelectQueryDef(): SelectQueryDef;
|
|
1102
|
+
}): ExprUnit<ColumnPrimitiveMap[TStr] | undefined>;
|
|
1103
|
+
/**
|
|
1104
|
+
* ROW_NUMBER() - 파티션 내 행 번호
|
|
1105
|
+
*
|
|
1106
|
+
* 각 파티션 내에서 1부터 시작하는 순차 번호 부여
|
|
1107
|
+
*
|
|
1108
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1109
|
+
* @returns 행 번호 (1부터 시작)
|
|
1110
|
+
*
|
|
1111
|
+
* @example
|
|
1112
|
+
* ```typescript
|
|
1113
|
+
* db.order().select((o) => ({
|
|
1114
|
+
* ...o,
|
|
1115
|
+
* rowNum: expr.rowNumber({
|
|
1116
|
+
* partitionBy: [o.userId],
|
|
1117
|
+
* orderBy: [[o.createdAt, "DESC"]],
|
|
1118
|
+
* }),
|
|
1119
|
+
* }))
|
|
1120
|
+
* // SELECT *, ROW_NUMBER() OVER (PARTITION BY userId ORDER BY createdAt DESC)
|
|
1121
|
+
* ```
|
|
1122
|
+
*/
|
|
1123
|
+
rowNumber(spec: WinSpecInput): ExprUnit<number>;
|
|
1124
|
+
/**
|
|
1125
|
+
* RANK() - 파티션 내 순위 (동점 시 같은 순위, 다음 순위 건너뜀)
|
|
1126
|
+
*
|
|
1127
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1128
|
+
* @returns 순위 (동점 후 건너뜀: 1, 1, 3)
|
|
1129
|
+
*
|
|
1130
|
+
* @example
|
|
1131
|
+
* ```typescript
|
|
1132
|
+
* db.student().select((s) => ({
|
|
1133
|
+
* name: s.name,
|
|
1134
|
+
* rank: expr.rank({
|
|
1135
|
+
* orderBy: [[s.score, "DESC"]],
|
|
1136
|
+
* }),
|
|
1137
|
+
* }))
|
|
1138
|
+
* ```
|
|
1139
|
+
*/
|
|
1140
|
+
rank(spec: WinSpecInput): ExprUnit<number>;
|
|
1141
|
+
/**
|
|
1142
|
+
* DENSE_RANK() - 파티션 내 밀집 순위 (동점 시 같은 순위, 다음 순위 유지)
|
|
1143
|
+
*
|
|
1144
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1145
|
+
* @returns 밀집 순위 (동점 후 연속: 1, 1, 2)
|
|
1146
|
+
*
|
|
1147
|
+
* @example
|
|
1148
|
+
* ```typescript
|
|
1149
|
+
* db.student().select((s) => ({
|
|
1150
|
+
* name: s.name,
|
|
1151
|
+
* denseRank: expr.denseRank({
|
|
1152
|
+
* orderBy: [[s.score, "DESC"]],
|
|
1153
|
+
* }),
|
|
1154
|
+
* }))
|
|
1155
|
+
* ```
|
|
1156
|
+
*/
|
|
1157
|
+
denseRank(spec: WinSpecInput): ExprUnit<number>;
|
|
1158
|
+
/**
|
|
1159
|
+
* NTILE(n) - 파티션을 n개 그룹으로 분할
|
|
1160
|
+
*
|
|
1161
|
+
* @param n - 분할할 그룹 수
|
|
1162
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1163
|
+
* @returns 그룹 번호 (1 ~ n)
|
|
1164
|
+
*
|
|
1165
|
+
* @example
|
|
1166
|
+
* ```typescript
|
|
1167
|
+
* // 상위 25%를 찾기 위한 사분위 분할
|
|
1168
|
+
* db.user().select((u) => ({
|
|
1169
|
+
* name: u.name,
|
|
1170
|
+
* quartile: expr.ntile(4, {
|
|
1171
|
+
* orderBy: [[u.score, "DESC"]],
|
|
1172
|
+
* }),
|
|
1173
|
+
* }))
|
|
1174
|
+
* ```
|
|
1175
|
+
*/
|
|
1176
|
+
ntile(n: number, spec: WinSpecInput): ExprUnit<number>;
|
|
1177
|
+
/**
|
|
1178
|
+
* LAG() - 이전 행의 값 참조
|
|
1179
|
+
*
|
|
1180
|
+
* @param column - 참조할 컬럼
|
|
1181
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1182
|
+
* @param options - offset (기본 1), default (이전 행이 없을 때 기본값)
|
|
1183
|
+
* @returns 이전 행의 값 (또는 기본값/NULL)
|
|
1184
|
+
*
|
|
1185
|
+
* @example
|
|
1186
|
+
* ```typescript
|
|
1187
|
+
* db.stock().select((s) => ({
|
|
1188
|
+
* date: s.date,
|
|
1189
|
+
* price: s.price,
|
|
1190
|
+
* prevPrice: expr.lag(s.price, {
|
|
1191
|
+
* partitionBy: [s.symbol],
|
|
1192
|
+
* orderBy: [[s.date, "ASC"]],
|
|
1193
|
+
* }),
|
|
1194
|
+
* }))
|
|
1195
|
+
* ```
|
|
1196
|
+
*/
|
|
1197
|
+
lag<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput, options?: {
|
|
1198
|
+
offset?: number;
|
|
1199
|
+
default?: ExprInput<T>;
|
|
1200
|
+
}): ExprUnit<T | undefined>;
|
|
1201
|
+
/**
|
|
1202
|
+
* LEAD() - 다음 행의 값 참조
|
|
1203
|
+
*
|
|
1204
|
+
* @param column - 참조할 컬럼
|
|
1205
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1206
|
+
* @param options - offset (기본 1), default (다음 행이 없을 때 기본값)
|
|
1207
|
+
* @returns 다음 행의 값 (또는 기본값/NULL)
|
|
1208
|
+
*
|
|
1209
|
+
* @example
|
|
1210
|
+
* ```typescript
|
|
1211
|
+
* db.stock().select((s) => ({
|
|
1212
|
+
* date: s.date,
|
|
1213
|
+
* price: s.price,
|
|
1214
|
+
* nextPrice: expr.lead(s.price, {
|
|
1215
|
+
* partitionBy: [s.symbol],
|
|
1216
|
+
* orderBy: [[s.date, "ASC"]],
|
|
1217
|
+
* }),
|
|
1218
|
+
* }))
|
|
1219
|
+
* ```
|
|
1220
|
+
*/
|
|
1221
|
+
lead<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput, options?: {
|
|
1222
|
+
offset?: number;
|
|
1223
|
+
default?: ExprInput<T>;
|
|
1224
|
+
}): ExprUnit<T | undefined>;
|
|
1225
|
+
/**
|
|
1226
|
+
* FIRST_VALUE() - 파티션/프레임의 첫 번째 값
|
|
1227
|
+
*
|
|
1228
|
+
* @param column - 참조할 컬럼
|
|
1229
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1230
|
+
* @returns 첫 번째 값
|
|
1231
|
+
*
|
|
1232
|
+
* @example
|
|
1233
|
+
* ```typescript
|
|
1234
|
+
* db.order().select((o) => ({
|
|
1235
|
+
* ...o,
|
|
1236
|
+
* firstOrderAmount: expr.firstValue(o.amount, {
|
|
1237
|
+
* partitionBy: [o.userId],
|
|
1238
|
+
* orderBy: [[o.createdAt, "ASC"]],
|
|
1239
|
+
* }),
|
|
1240
|
+
* }))
|
|
1241
|
+
* ```
|
|
1242
|
+
*/
|
|
1243
|
+
firstValue<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput): ExprUnit<T | undefined>;
|
|
1244
|
+
/**
|
|
1245
|
+
* LAST_VALUE() - 파티션/프레임의 마지막 값
|
|
1246
|
+
*
|
|
1247
|
+
* @param column - 참조할 컬럼
|
|
1248
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1249
|
+
* @returns 마지막 값
|
|
1250
|
+
*
|
|
1251
|
+
* @example
|
|
1252
|
+
* ```typescript
|
|
1253
|
+
* db.order().select((o) => ({
|
|
1254
|
+
* ...o,
|
|
1255
|
+
* lastOrderAmount: expr.lastValue(o.amount, {
|
|
1256
|
+
* partitionBy: [o.userId],
|
|
1257
|
+
* orderBy: [[o.createdAt, "ASC"]],
|
|
1258
|
+
* }),
|
|
1259
|
+
* }))
|
|
1260
|
+
* ```
|
|
1261
|
+
*/
|
|
1262
|
+
lastValue<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput): ExprUnit<T | undefined>;
|
|
1263
|
+
/**
|
|
1264
|
+
* SUM() OVER - 윈도우 합계
|
|
1265
|
+
*
|
|
1266
|
+
* @param column - 합계를 구할 컬럼
|
|
1267
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1268
|
+
* @returns 윈도우 내 합계
|
|
1269
|
+
*
|
|
1270
|
+
* @example
|
|
1271
|
+
* ```typescript
|
|
1272
|
+
* // 누적 합계
|
|
1273
|
+
* db.order().select((o) => ({
|
|
1274
|
+
* ...o,
|
|
1275
|
+
* runningTotal: expr.sumOver(o.amount, {
|
|
1276
|
+
* partitionBy: [o.userId],
|
|
1277
|
+
* orderBy: [[o.createdAt, "ASC"]],
|
|
1278
|
+
* }),
|
|
1279
|
+
* }))
|
|
1280
|
+
* ```
|
|
1281
|
+
*/
|
|
1282
|
+
sumOver(column: ExprUnit<number | undefined>, spec: WinSpecInput): ExprUnit<number | undefined>;
|
|
1283
|
+
/**
|
|
1284
|
+
* AVG() OVER - 윈도우 평균
|
|
1285
|
+
*
|
|
1286
|
+
* @param column - 평균을 구할 컬럼
|
|
1287
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1288
|
+
* @returns 윈도우 내 평균
|
|
1289
|
+
*
|
|
1290
|
+
* @example
|
|
1291
|
+
* ```typescript
|
|
1292
|
+
* // 이동 평균
|
|
1293
|
+
* db.stock().select((s) => ({
|
|
1294
|
+
* ...s,
|
|
1295
|
+
* movingAvg: expr.avgOver(s.price, {
|
|
1296
|
+
* partitionBy: [s.symbol],
|
|
1297
|
+
* orderBy: [[s.date, "ASC"]],
|
|
1298
|
+
* }),
|
|
1299
|
+
* }))
|
|
1300
|
+
* ```
|
|
1301
|
+
*/
|
|
1302
|
+
avgOver(column: ExprUnit<number | undefined>, spec: WinSpecInput): ExprUnit<number | undefined>;
|
|
1303
|
+
/**
|
|
1304
|
+
* COUNT() OVER - 윈도우 카운트
|
|
1305
|
+
*
|
|
1306
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1307
|
+
* @param column - 카운트할 컬럼 (생략 시 전체 행 수)
|
|
1308
|
+
* @returns 윈도우 내 행 수
|
|
1309
|
+
*
|
|
1310
|
+
* @example
|
|
1311
|
+
* ```typescript
|
|
1312
|
+
* db.order().select((o) => ({
|
|
1313
|
+
* ...o,
|
|
1314
|
+
* totalOrdersPerUser: expr.countOver({
|
|
1315
|
+
* partitionBy: [o.userId],
|
|
1316
|
+
* }),
|
|
1317
|
+
* }))
|
|
1318
|
+
* ```
|
|
1319
|
+
*/
|
|
1320
|
+
countOver(spec: WinSpecInput, column?: ExprUnit<ColumnPrimitive>): ExprUnit<number>;
|
|
1321
|
+
/**
|
|
1322
|
+
* MIN() OVER - 윈도우 최소값
|
|
1323
|
+
*
|
|
1324
|
+
* @param column - 최소값을 구할 컬럼
|
|
1325
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1326
|
+
* @returns 윈도우 내 최소값
|
|
1327
|
+
*
|
|
1328
|
+
* @example
|
|
1329
|
+
* ```typescript
|
|
1330
|
+
* db.stock().select((s) => ({
|
|
1331
|
+
* ...s,
|
|
1332
|
+
* minPriceInPeriod: expr.minOver(s.price, {
|
|
1333
|
+
* partitionBy: [s.symbol],
|
|
1334
|
+
* }),
|
|
1335
|
+
* }))
|
|
1336
|
+
* ```
|
|
1337
|
+
*/
|
|
1338
|
+
minOver<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput): ExprUnit<T | undefined>;
|
|
1339
|
+
/**
|
|
1340
|
+
* MAX() OVER - 윈도우 최대값
|
|
1341
|
+
*
|
|
1342
|
+
* @param column - 최대값을 구할 컬럼
|
|
1343
|
+
* @param spec - 윈도우 스펙 (partitionBy, orderBy)
|
|
1344
|
+
* @returns 윈도우 내 최대값
|
|
1345
|
+
*
|
|
1346
|
+
* @example
|
|
1347
|
+
* ```typescript
|
|
1348
|
+
* db.stock().select((s) => ({
|
|
1349
|
+
* ...s,
|
|
1350
|
+
* maxPriceInPeriod: expr.maxOver(s.price, {
|
|
1351
|
+
* partitionBy: [s.symbol],
|
|
1352
|
+
* }),
|
|
1353
|
+
* }))
|
|
1354
|
+
* ```
|
|
1355
|
+
*/
|
|
1356
|
+
maxOver<T extends ColumnPrimitive>(column: ExprUnit<T>, spec: WinSpecInput): ExprUnit<T | undefined>;
|
|
1357
|
+
/**
|
|
1358
|
+
* ExprInput을 Expr로 변환 (내부용)
|
|
1359
|
+
*
|
|
1360
|
+
* @param value - 변환할 값
|
|
1361
|
+
* @returns Expr JSON AST
|
|
1362
|
+
*/
|
|
1363
|
+
toExpr(value: ExprInput<ColumnPrimitive>): Expr;
|
|
1364
|
+
};
|
|
1365
|
+
declare function ifNull<T extends ColumnPrimitive>(...args: [ExprInput<T | undefined>, ...ExprInput<T | undefined>[], ExprInput<NonNullable<T>>]): ExprUnit<NonNullable<T>>;
|
|
1366
|
+
declare function ifNull<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
|
|
1367
|
+
export declare function toExpr(value: ExprInput<ColumnPrimitive>): Expr;
|
|
1368
|
+
export {};
|
|
1369
|
+
//# sourceMappingURL=expr.d.ts.map
|