44package sqlbuilder
55
66import (
7- "fmt"
87 "strings"
98)
109
@@ -15,17 +14,25 @@ type Cond struct {
1514
1615// Equal represents "field = value".
1716func (c * Cond ) Equal (field string , value interface {}) string {
18- return fmt .Sprintf ("%s = %s" , Escape (field ), c .Args .Add (value ))
17+ buf := & strings.Builder {}
18+ buf .WriteString (Escape (field ))
19+ buf .WriteString (" = " )
20+ buf .WriteString (c .Args .Add (value ))
21+ return buf .String ()
1922}
2023
2124// E is an alias of Equal.
2225func (c * Cond ) E (field string , value interface {}) string {
2326 return c .Equal (field , value )
2427}
2528
26- // NotEqual represents "field != value".
29+ // NotEqual represents "field <> value".
2730func (c * Cond ) NotEqual (field string , value interface {}) string {
28- return fmt .Sprintf ("%s <> %s" , Escape (field ), c .Args .Add (value ))
31+ buf := & strings.Builder {}
32+ buf .WriteString (Escape (field ))
33+ buf .WriteString (" <> " )
34+ buf .WriteString (c .Args .Add (value ))
35+ return buf .String ()
2936}
3037
3138// NE is an alias of NotEqual.
@@ -35,7 +42,11 @@ func (c *Cond) NE(field string, value interface{}) string {
3542
3643// GreaterThan represents "field > value".
3744func (c * Cond ) GreaterThan (field string , value interface {}) string {
38- return fmt .Sprintf ("%s > %s" , Escape (field ), c .Args .Add (value ))
45+ buf := & strings.Builder {}
46+ buf .WriteString (Escape (field ))
47+ buf .WriteString (" > " )
48+ buf .WriteString (c .Args .Add (value ))
49+ return buf .String ()
3950}
4051
4152// G is an alias of GreaterThan.
@@ -45,7 +56,11 @@ func (c *Cond) G(field string, value interface{}) string {
4556
4657// GreaterEqualThan represents "field >= value".
4758func (c * Cond ) GreaterEqualThan (field string , value interface {}) string {
48- return fmt .Sprintf ("%s >= %s" , Escape (field ), c .Args .Add (value ))
59+ buf := & strings.Builder {}
60+ buf .WriteString (Escape (field ))
61+ buf .WriteString (" >= " )
62+ buf .WriteString (c .Args .Add (value ))
63+ return buf .String ()
4964}
5065
5166// GE is an alias of GreaterEqualThan.
@@ -55,7 +70,11 @@ func (c *Cond) GE(field string, value interface{}) string {
5570
5671// LessThan represents "field < value".
5772func (c * Cond ) LessThan (field string , value interface {}) string {
58- return fmt .Sprintf ("%s < %s" , Escape (field ), c .Args .Add (value ))
73+ buf := & strings.Builder {}
74+ buf .WriteString (Escape (field ))
75+ buf .WriteString (" < " )
76+ buf .WriteString (c .Args .Add (value ))
77+ return buf .String ()
5978}
6079
6180// L is an alias of LessThan.
@@ -65,7 +84,11 @@ func (c *Cond) L(field string, value interface{}) string {
6584
6685// LessEqualThan represents "field <= value".
6786func (c * Cond ) LessEqualThan (field string , value interface {}) string {
68- return fmt .Sprintf ("%s <= %s" , Escape (field ), c .Args .Add (value ))
87+ buf := & strings.Builder {}
88+ buf .WriteString (Escape (field ))
89+ buf .WriteString (" <= " )
90+ buf .WriteString (c .Args .Add (value ))
91+ return buf .String ()
6992}
7093
7194// LE is an alias of LessEqualThan.
@@ -81,7 +104,12 @@ func (c *Cond) In(field string, value ...interface{}) string {
81104 vs = append (vs , c .Args .Add (v ))
82105 }
83106
84- return fmt .Sprintf ("%s IN (%s)" , Escape (field ), strings .Join (vs , ", " ))
107+ buf := & strings.Builder {}
108+ buf .WriteString (Escape (field ))
109+ buf .WriteString (" IN (" )
110+ buf .WriteString (strings .Join (vs , ", " ))
111+ buf .WriteString (")" )
112+ return buf .String ()
85113}
86114
87115// NotIn represents "field NOT IN (value...)".
@@ -92,47 +120,158 @@ func (c *Cond) NotIn(field string, value ...interface{}) string {
92120 vs = append (vs , c .Args .Add (v ))
93121 }
94122
95- return fmt .Sprintf ("%s NOT IN (%s)" , Escape (field ), strings .Join (vs , ", " ))
123+ buf := & strings.Builder {}
124+ buf .WriteString (Escape (field ))
125+ buf .WriteString (" NOT IN (" )
126+ buf .WriteString (strings .Join (vs , ", " ))
127+ buf .WriteString (")" )
128+ return buf .String ()
96129}
97130
98131// Like represents "field LIKE value".
99132func (c * Cond ) Like (field string , value interface {}) string {
100- return fmt .Sprintf ("%s LIKE %s" , Escape (field ), c .Args .Add (value ))
133+ buf := & strings.Builder {}
134+ buf .WriteString (Escape (field ))
135+ buf .WriteString (" LIKE " )
136+ buf .WriteString (c .Args .Add (value ))
137+ return buf .String ()
101138}
102139
103140// NotLike represents "field NOT LIKE value".
104141func (c * Cond ) NotLike (field string , value interface {}) string {
105- return fmt .Sprintf ("%s NOT LIKE %s" , Escape (field ), c .Args .Add (value ))
142+ buf := & strings.Builder {}
143+ buf .WriteString (Escape (field ))
144+ buf .WriteString (" NOT LIKE " )
145+ buf .WriteString (c .Args .Add (value ))
146+ return buf .String ()
106147}
107148
108149// IsNull represents "field IS NULL".
109150func (c * Cond ) IsNull (field string ) string {
110- return fmt .Sprintf ("%s IS NULL" , Escape (field ))
151+ buf := & strings.Builder {}
152+ buf .WriteString (Escape (field ))
153+ buf .WriteString (" IS NULL" )
154+ return buf .String ()
111155}
112156
113157// IsNotNull represents "field IS NOT NULL".
114158func (c * Cond ) IsNotNull (field string ) string {
115- return fmt .Sprintf ("%s IS NOT NULL" , Escape (field ))
159+ buf := & strings.Builder {}
160+ buf .WriteString (Escape (field ))
161+ buf .WriteString (" IS NOT NULL" )
162+ return buf .String ()
116163}
117164
118165// Between represents "field BETWEEN lower AND upper".
119166func (c * Cond ) Between (field string , lower , upper interface {}) string {
120- return fmt .Sprintf ("%s BETWEEN %s AND %s" , Escape (field ), c .Args .Add (lower ), c .Args .Add (upper ))
167+ buf := & strings.Builder {}
168+ buf .WriteString (Escape (field ))
169+ buf .WriteString (" BETWEEN " )
170+ buf .WriteString (c .Args .Add (lower ))
171+ buf .WriteString (" AND " )
172+ buf .WriteString (c .Args .Add (upper ))
173+ return buf .String ()
121174}
122175
123176// NotBetween represents "field NOT BETWEEN lower AND upper".
124177func (c * Cond ) NotBetween (field string , lower , upper interface {}) string {
125- return fmt .Sprintf ("%s NOT BETWEEN %s AND %s" , Escape (field ), c .Args .Add (lower ), c .Args .Add (upper ))
178+ buf := & strings.Builder {}
179+ buf .WriteString (Escape (field ))
180+ buf .WriteString (" NOT BETWEEN " )
181+ buf .WriteString (c .Args .Add (lower ))
182+ buf .WriteString (" AND " )
183+ buf .WriteString (c .Args .Add (upper ))
184+ return buf .String ()
126185}
127186
128187// Or represents OR logic like "expr1 OR expr2 OR expr3".
129188func (c * Cond ) Or (orExpr ... string ) string {
130- return fmt .Sprintf ("(%s)" , strings .Join (orExpr , " OR " ))
189+ buf := & strings.Builder {}
190+ buf .WriteString ("(" )
191+ buf .WriteString (strings .Join (orExpr , " OR " ))
192+ buf .WriteString (")" )
193+ return buf .String ()
131194}
132195
133196// And represents AND logic like "expr1 AND expr2 AND expr3".
134197func (c * Cond ) And (andExpr ... string ) string {
135- return fmt .Sprintf ("(%s)" , strings .Join (andExpr , " AND " ))
198+ buf := & strings.Builder {}
199+ buf .WriteString ("(" )
200+ buf .WriteString (strings .Join (andExpr , " AND " ))
201+ buf .WriteString (")" )
202+ return buf .String ()
203+ }
204+
205+ // Exists represents "EXISTS (subquery)".
206+ func (c * Cond ) Exists (subquery interface {}) string {
207+ buf := & strings.Builder {}
208+ buf .WriteString ("EXISTS (" )
209+ buf .WriteString (c .Args .Add (subquery ))
210+ buf .WriteString (")" )
211+ return buf .String ()
212+ }
213+
214+ // NotExists represents "NOT EXISTS (subquery)".
215+ func (c * Cond ) NotExists (subquery interface {}) string {
216+ buf := & strings.Builder {}
217+ buf .WriteString ("NOT EXISTS (" )
218+ buf .WriteString (c .Args .Add (subquery ))
219+ buf .WriteString (")" )
220+ return buf .String ()
221+ }
222+
223+ // Any represents "field op ANY (value...)".
224+ func (c * Cond ) Any (field , op string , value ... interface {}) string {
225+ vs := make ([]string , 0 , len (value ))
226+
227+ for _ , v := range value {
228+ vs = append (vs , c .Args .Add (v ))
229+ }
230+
231+ buf := & strings.Builder {}
232+ buf .WriteString (Escape (field ))
233+ buf .WriteString (" " )
234+ buf .WriteString (op )
235+ buf .WriteString (" ANY (" )
236+ buf .WriteString (strings .Join (vs , ", " ))
237+ buf .WriteString (")" )
238+ return buf .String ()
239+ }
240+
241+ // All represents "field op ALL (value...)".
242+ func (c * Cond ) All (field , op string , value ... interface {}) string {
243+ vs := make ([]string , 0 , len (value ))
244+
245+ for _ , v := range value {
246+ vs = append (vs , c .Args .Add (v ))
247+ }
248+
249+ buf := & strings.Builder {}
250+ buf .WriteString (Escape (field ))
251+ buf .WriteString (" " )
252+ buf .WriteString (op )
253+ buf .WriteString (" ALL (" )
254+ buf .WriteString (strings .Join (vs , ", " ))
255+ buf .WriteString (")" )
256+ return buf .String ()
257+ }
258+
259+ // Some represents "field op SOME (value...)".
260+ func (c * Cond ) Some (field , op string , value ... interface {}) string {
261+ vs := make ([]string , 0 , len (value ))
262+
263+ for _ , v := range value {
264+ vs = append (vs , c .Args .Add (v ))
265+ }
266+
267+ buf := & strings.Builder {}
268+ buf .WriteString (Escape (field ))
269+ buf .WriteString (" " )
270+ buf .WriteString (op )
271+ buf .WriteString (" SOME (" )
272+ buf .WriteString (strings .Join (vs , ", " ))
273+ buf .WriteString (")" )
274+ return buf .String ()
136275}
137276
138277// Var returns a placeholder for value.
0 commit comments