conditions.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package sql
  2. import "strings"
  3. // Conditions 数据库条件
  4. type Conditions struct {
  5. queries []string
  6. args [][]any
  7. err error
  8. }
  9. // NewConditions 创建数据库条件
  10. func NewConditions() *Conditions {
  11. return &Conditions{
  12. queries: make([]string, 0),
  13. args: make([][]any, 0),
  14. }
  15. }
  16. // AddCondition 添加条件
  17. // 参数:
  18. // - query: 条件语句,如: name LIKE ? AND age = ?
  19. // - args: 预编译值,如: foo, 10
  20. // 返回值:
  21. // - 数据库条件
  22. func (conditions *Conditions) AddCondition(query string, args ...any) *Conditions {
  23. conditions.queries = append(conditions.queries, query)
  24. conditions.args = append(conditions.args, args)
  25. return conditions
  26. }
  27. // Equal 添加相等条件
  28. // 参数:
  29. // - columnName: 列名
  30. // - arg: 列值
  31. // 返回值:
  32. // - 数据库条件
  33. func (conditions *Conditions) Equal(columnName string, arg any) *Conditions {
  34. if conditions.err != nil {
  35. return conditions
  36. }
  37. conditions.appendQuery(columnName, " = ?")
  38. conditions.args = append(conditions.args, []any{arg})
  39. return conditions
  40. }
  41. // Like 添加LIKE条件
  42. // 参数:
  43. // - columnName: 列名
  44. // - arg: 列值
  45. // 返回值:
  46. // - 数据库条件
  47. func (conditions *Conditions) Like(columnName string, arg string) *Conditions {
  48. if conditions.err != nil {
  49. return conditions
  50. }
  51. conditions.appendQuery(columnName, " LIKE ?")
  52. conditions.args = append(conditions.args, []any{arg})
  53. return conditions
  54. }
  55. // In 添加IN条件
  56. // 参数:
  57. // - columnName: 列名
  58. // - arg: 列值
  59. // 返回值:
  60. // - 数据库条件
  61. func (conditions *Conditions) In(columnName string, arg any) *Conditions {
  62. if conditions.err != nil {
  63. return conditions
  64. }
  65. conditions.appendQuery(columnName, " IN ?")
  66. conditions.args = append(conditions.args, []any{arg})
  67. return conditions
  68. }
  69. // NotIn 添加NOT IN条件
  70. // 参数:
  71. // - columnName: 列名
  72. // - arg: 列值
  73. // 返回值:
  74. // - 数据库条件
  75. func (conditions *Conditions) NotIn(columnName string, arg any) *Conditions {
  76. if conditions.err != nil {
  77. return conditions
  78. }
  79. conditions.appendQuery(columnName, " NOT IN ?")
  80. conditions.args = append(conditions.args, []any{arg})
  81. return conditions
  82. }
  83. // Not 添加不相等条件
  84. // 参数:
  85. // - columnName: 列名
  86. // - arg: 列值
  87. // 返回值:
  88. // - 数据库条件
  89. func (conditions *Conditions) Not(columnName string, arg any) *Conditions {
  90. if conditions.err != nil {
  91. return conditions
  92. }
  93. conditions.appendQuery(columnName, " != ?")
  94. conditions.args = append(conditions.args, []any{arg})
  95. return conditions
  96. }
  97. // LessThan 添加小于条件
  98. // 参数:
  99. // - columnName: 列名
  100. // - arg: 列值
  101. // 返回值:
  102. // - 数据库条件
  103. func (conditions *Conditions) LessThan(columnName string, arg any) *Conditions {
  104. if conditions.err != nil {
  105. return conditions
  106. }
  107. conditions.appendQuery(columnName, " < ?")
  108. conditions.args = append(conditions.args, []any{arg})
  109. return conditions
  110. }
  111. // LessThanAndEqual 添加小于等于条件
  112. // 参数:
  113. // - columnName: 列名
  114. // - arg: 列值
  115. // 返回值:
  116. // - 数据库条件
  117. func (conditions *Conditions) LessThanAndEqual(columnName string, arg any) *Conditions {
  118. if conditions.err != nil {
  119. return conditions
  120. }
  121. conditions.appendQuery(columnName, " <= ?")
  122. conditions.args = append(conditions.args, []any{arg})
  123. return conditions
  124. }
  125. // GreaterThan 添加大于条件
  126. // 参数:
  127. // - columnName: 列名
  128. // - arg: 列值
  129. // 返回值:
  130. // - 数据库条件
  131. func (conditions *Conditions) GreaterThan(columnName string, arg any) *Conditions {
  132. if conditions.err != nil {
  133. return conditions
  134. }
  135. conditions.appendQuery(columnName, " > ?")
  136. conditions.args = append(conditions.args, []any{arg})
  137. return conditions
  138. }
  139. // GreaterThanAndEqual 添加大于等于条件
  140. // 参数:
  141. // - columnName: 列名
  142. // - arg: 列值
  143. // 返回值:
  144. // - 数据库条件
  145. func (conditions *Conditions) GreaterThanAndEqual(columnName string, arg any) *Conditions {
  146. if conditions.err != nil {
  147. return conditions
  148. }
  149. conditions.appendQuery(columnName, " >= ?")
  150. conditions.args = append(conditions.args, []any{arg})
  151. return conditions
  152. }
  153. // Queries 获取所有查询条件语句
  154. // 参数: 无
  155. // 返回值:
  156. // - 查询条件
  157. func (conditions *Conditions) Queries() []string {
  158. return conditions.queries
  159. }
  160. // Args 获取所有查询条件值
  161. // 参数: 无
  162. // 返回值:
  163. // - 查询条件值
  164. func (conditions *Conditions) Args() []any {
  165. args := make([]any, 0)
  166. for _, conditionArgs := range conditions.args {
  167. if conditionArgs == nil {
  168. continue
  169. }
  170. if len(conditionArgs) == 1 {
  171. args = append(args, conditionArgs[0])
  172. } else {
  173. args = append(args, conditionArgs)
  174. }
  175. }
  176. return args
  177. }
  178. // And 获取构造的AND条件语句
  179. // 参数: 无
  180. // 返回值:
  181. // - 构造的AND条件语句
  182. func (conditions *Conditions) And() string {
  183. return conditions.formClause("AND")
  184. }
  185. // OR 获取构造的OR条件语句
  186. // 参数: 无
  187. // 返回值:
  188. // - 构造的AND条件语句
  189. func (conditions *Conditions) OR() string {
  190. return conditions.formClause("OR")
  191. }
  192. func (conditions *Conditions) appendQuery(columnName string, expr string) {
  193. conditions.queries = append(conditions.queries, `"`+columnName+`"`+expr)
  194. }
  195. func (conditions *Conditions) formClause(conditionOperator string) string {
  196. if conditions.queries == nil || len(conditions.queries) == 0 {
  197. return ""
  198. }
  199. stringBuilder := strings.Builder{}
  200. for i, query := range conditions.queries {
  201. stringBuilder.WriteString(query)
  202. if i != len(conditions.queries)-1 {
  203. stringBuilder.WriteString(" " + conditionOperator + " ")
  204. }
  205. }
  206. return stringBuilder.String()
  207. }