@@ -110,6 +110,7 @@ type JSONQueryExpression struct {
110
110
keys []string
111
111
hasKeys bool
112
112
equals bool
113
+ likes bool
113
114
equalsValue interface {}
114
115
extract bool
115
116
path string
@@ -142,6 +143,14 @@ func (jsonQuery *JSONQueryExpression) Equals(value interface{}, keys ...string)
142
143
return jsonQuery
143
144
}
144
145
146
+ // Likes return clause.Expression
147
+ func (jsonQuery * JSONQueryExpression ) Likes (value interface {}, keys ... string ) * JSONQueryExpression {
148
+ jsonQuery .keys = keys
149
+ jsonQuery .likes = true
150
+ jsonQuery .equalsValue = value
151
+ return jsonQuery
152
+ }
153
+
145
154
// Build implements clause.Expression
146
155
func (jsonQuery * JSONQueryExpression ) Build (builder clause.Builder ) {
147
156
if stmt , ok := builder .(* gorm.Statement ); ok {
@@ -175,6 +184,19 @@ func (jsonQuery *JSONQueryExpression) Build(builder clause.Builder) {
175
184
stmt .AddVar (builder , jsonQuery .equalsValue )
176
185
}
177
186
}
187
+ case jsonQuery .likes :
188
+ if len (jsonQuery .keys ) > 0 {
189
+ builder .WriteString ("JSON_EXTRACT(" )
190
+ builder .WriteQuoted (jsonQuery .column )
191
+ builder .WriteByte (',' )
192
+ builder .AddVar (stmt , jsonQueryJoin (jsonQuery .keys ))
193
+ builder .WriteString (") LIKE " )
194
+ if value , ok := jsonQuery .equalsValue .(bool ); ok {
195
+ builder .WriteString (strconv .FormatBool (value ))
196
+ } else {
197
+ stmt .AddVar (builder , jsonQuery .equalsValue )
198
+ }
199
+ }
178
200
}
179
201
case "postgres" :
180
202
switch {
@@ -206,6 +228,24 @@ func (jsonQuery *JSONQueryExpression) Build(builder clause.Builder) {
206
228
}
207
229
builder .WriteString (") = " )
208
230
231
+ if _ , ok := jsonQuery .equalsValue .(string ); ok {
232
+ stmt .AddVar (builder , jsonQuery .equalsValue )
233
+ } else {
234
+ stmt .AddVar (builder , fmt .Sprint (jsonQuery .equalsValue ))
235
+ }
236
+ }
237
+ case jsonQuery .likes :
238
+ if len (jsonQuery .keys ) > 0 {
239
+ builder .WriteString (fmt .Sprintf ("json_extract_path_text(%v::json," , stmt .Quote (jsonQuery .column )))
240
+
241
+ for idx , key := range jsonQuery .keys {
242
+ if idx > 0 {
243
+ builder .WriteByte (',' )
244
+ }
245
+ stmt .AddVar (builder , key )
246
+ }
247
+ builder .WriteString (") LIKE " )
248
+
209
249
if _ , ok := jsonQuery .equalsValue .(string ); ok {
210
250
stmt .AddVar (builder , jsonQuery .equalsValue )
211
251
} else {
0 commit comments