whereBuild.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package utils
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. type NullType byte
  7. const (
  8. _ NullType = iota
  9. IsNull
  10. IsNotNull
  11. )
  12. func WhereBuild(where map[string]interface{}) (whereSQL string, vals []interface{}, err error) {
  13. for k, v := range where {
  14. ks := strings.Split(k, " ")
  15. if len(ks) > 2 {
  16. return "", nil, fmt.Errorf("Error in query condition: %s. ", k)
  17. }
  18. if whereSQL != "" {
  19. whereSQL += " AND "
  20. }
  21. strings.Join(ks, ",")
  22. switch len(ks) {
  23. case 1:
  24. switch v := v.(type) {
  25. case NullType:
  26. if v == IsNotNull {
  27. whereSQL += fmt.Sprint(k, " IS NOT NULL")
  28. } else {
  29. whereSQL += fmt.Sprint(k, " IS NULL")
  30. }
  31. default:
  32. whereSQL += fmt.Sprint(k, "=?")
  33. vals = append(vals, v)
  34. }
  35. break
  36. case 2:
  37. k = ks[0]
  38. switch ks[1] {
  39. case "=":
  40. whereSQL += fmt.Sprint(k, "=?")
  41. vals = append(vals, v)
  42. break
  43. case ">":
  44. whereSQL += fmt.Sprint(k, ">?")
  45. vals = append(vals, v)
  46. break
  47. case ">=":
  48. whereSQL += fmt.Sprint(k, ">=?")
  49. vals = append(vals, v)
  50. break
  51. case "<":
  52. whereSQL += fmt.Sprint(k, "<?")
  53. vals = append(vals, v)
  54. break
  55. case "<=":
  56. whereSQL += fmt.Sprint(k, "<=?")
  57. vals = append(vals, v)
  58. break
  59. case "!=":
  60. whereSQL += fmt.Sprint(k, "!=?")
  61. vals = append(vals, v)
  62. break
  63. case "<>":
  64. whereSQL += fmt.Sprint(k, "!=?")
  65. vals = append(vals, v)
  66. break
  67. case "in":
  68. whereSQL += fmt.Sprint(k, " in (?)")
  69. vals = append(vals, v)
  70. break
  71. case "like":
  72. whereSQL += fmt.Sprint(k, " like ?")
  73. vals = append(vals, v)
  74. }
  75. break
  76. }
  77. }
  78. return
  79. }