-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathspellsql_select.go
More file actions
184 lines (160 loc) · 5.07 KB
/
Copy pathspellsql_select.go
File metadata and controls
184 lines (160 loc) · 5.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package spellsql
import (
"strings"
"gitee.com/xuesongtao/spellsql/v2/builder"
"gitee.com/xuesongtao/spellsql/v2/internal"
"gitee.com/xuesongtao/spellsql/v2/utils"
)
func (s *SqlStrObj) getSelectBuilder() *builder.Select {
return s.builder.(*builder.Select)
}
// SetJoin 设置 join
func (s *SqlStrObj) SetJoin(tableName string, on string, joinType ...uint8) *SqlStrObj {
if len(joinType) > 0 {
switch joinType[0] {
case LJI:
s.getSelectBuilder().LeftJoin(tableName, on)
case RJI:
s.getSelectBuilder().RightJoin(tableName, on)
}
} else {
s.getSelectBuilder().Join(tableName, on)
}
return s
}
// SetLeftJoin 设置 left join
func (s *SqlStrObj) SetLeftJoin(tableName string, on string) *SqlStrObj {
return s.SetJoin(tableName, on, LJI)
}
// SetRightJoin 设置 right join
func (s *SqlStrObj) SetRightJoin(tableName string, on string) *SqlStrObj {
return s.SetJoin(tableName, on, RJI)
}
// SetWhere 设置过滤条件, 连接符为 AND
// 如果 len = 1 的时候, 会拼接成: filed = arg
// 如果 len = 2 的时候, 会拼接成: filed arg[0] arg[1]
func (s *SqlStrObj) SetWhere(fieldName string, args ...interface{}) *SqlStrObj {
return s.setWhere(internal.SELECT, fieldName, args...)
}
// SetOrWhere 设置过滤条件, 连接符为 OR
// 如果 len = 1 的时候, 会拼接成: filed = arg
// 如果 len = 2 的时候, 会拼接成: filed arg[0] arg[1]
func (s *SqlStrObj) SetOrWhere(fieldName string, args ...interface{}) *SqlStrObj {
return s.setWhere(internal.SELECT_OR, fieldName, args...)
}
// setWhere 转换参数
func (s *SqlStrObj) setWhere(opType internal.OpType, fieldName string, args ...interface{}) *SqlStrObj {
argsLen := len(args)
if argsLen == 0 {
args = []interface{}{internal.NULL}
}
// 默认操作符为 "="
opSymbol := "="
arg := args[0]
// 如果参数个数大于等于 2 的话, 就会包含操作符, 所以这里需要替换下
if argsLen >= 2 {
tmpOpSymbol, ok := args[0].(string)
if ok {
opSymbol = tmpOpSymbol
}
arg = args[1]
}
// 处理字段, 如: fieldName = "test"
sqlStr := fieldName + " " + opSymbol
needAdd := true // 标记是否需要添加占位符
switch opSymbol {
case "IN", "in":
sqlStr += " ("
if v, ok := arg.(string); ok {
// 子查询就原样输入
v = strings.TrimPrefix(v, "") // 去掉空
if len(v) > 6 && internal.ToUpper(v[:6]) == "SELECT" {
sqlStr += "?v"
needAdd = false
}
}
if needAdd {
sqlStr += "?"
needAdd = false
}
sqlStr += ")"
}
if needAdd {
sqlStr += " ?"
}
builder.WhereCb(s.builder, func(wb *builder.Where) {
if opType == internal.SELECT_OR {
wb.Or(sqlStr, arg)
} else {
wb.And(sqlStr, arg)
}
})
return s
}
// SetRightLike 设置右模糊查询, 如: xxx LIKE "test%"
func (s *SqlStrObj) SetRightLike(fieldName string, val string) *SqlStrObj {
s.setWhere(internal.SELECT_AND, fieldName, "LIKE", builder.EscapeLike(val)+"%")
return s
}
// SetLeftLike 设置左模糊查询, 如: xxx LIKE "%test"
func (s *SqlStrObj) SetLeftLike(fieldName string, val string) *SqlStrObj {
s.setWhere(internal.SELECT_AND, fieldName, "LIKE", "%"+builder.EscapeLike(val))
return s
}
// SetAllLike 设置全模糊, 如: xxx LIKE "%test%"
func (s *SqlStrObj) SetAllLike(fieldName string, val string) *SqlStrObj {
s.setWhere(internal.SELECT_AND, fieldName, "LIKE", "%"+builder.EscapeLike(val)+"%")
return s
}
// SetBetween 设置 BETWEEN ? AND ?
func (s *SqlStrObj) SetBetween(fieldName string, leftVal, rightVal interface{}) *SqlStrObj {
return s.SetWhereArgs("(?v BETWEEN ? AND ?)", fieldName, leftVal, rightVal)
}
// SetWhereArgs 支持占位符
// 如: SetWhereArgs("username = ? AND password = ?d", "test", "123")
// => xxx AND "username = "test" AND password = 123
func (s *SqlStrObj) SetWhereArgs(sqlStr string, args ...interface{}) *SqlStrObj {
builder.WhereCb(s.builder, func(wb *builder.Where) {
wb.And(sqlStr, args...)
})
return s
}
// SetOrWhereArgs 支持占位符
// 如: SetOrWhereArgs("username = ? AND password = ?d", "test", "123")
// => xxx OR "username = "test" AND password = 123
func (s *SqlStrObj) SetOrWhereArgs(sqlStr string, args ...interface{}) *SqlStrObj {
builder.WhereCb(s.builder, func(wb *builder.Where) {
wb.Or(" "+sqlStr, args...)
})
return s
}
// SetOrderByStr 设置排序
func (s *SqlStrObj) SetOrderByStr(orderByStr string) *SqlStrObj {
if orderByStr == "" {
return s
}
s.getSelectBuilder().OrderBy(orderByStr)
return s
}
// GetOffset 根据分页获取 offset
// 注: page, size 只支持 int 系列类型
func (s *SqlStrObj) GetOffset(page, size interface{}) (int64, int64) {
return utils.GetOffset(page, size)
}
// SetLimit 设置分页
// page 从 1 开始
// 注: page, size 只支持 int 系列类型
func (s *SqlStrObj) SetLimit(page, size interface{}) *SqlStrObj {
s.getSelectBuilder().Limit(page, size)
return s
}
// SetGroupByStr 设置 groupBy
func (s *SqlStrObj) SetGroupByStr(groupByStr string) *SqlStrObj {
s.getSelectBuilder().GroupBy(groupByStr)
return s
}
// SetHaving 设置 Having
func (s *SqlStrObj) SetHaving(having string, args ...interface{}) *SqlStrObj {
s.getSelectBuilder().Having(having, args...)
return s
}