sql.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package utils
  2. import (
  3. "errors"
  4. "fmt"
  5. "regexp"
  6. )
  7. type Driver string
  8. const (
  9. DM Driver = "dm"
  10. MySql Driver = "mysql"
  11. )
  12. var supportDriverMap = map[string]Driver{
  13. "mysql": MySql,
  14. "dm": DM,
  15. }
  16. func GroupUnitFunc(driver string, column, delimiter string, columnOrder bool, orderField, orderRule string, hasDistinct bool) (sqlStr string) {
  17. dbDriver, _ := getDriverInstance(driver)
  18. if delimiter == "" {
  19. delimiter = ","
  20. }
  21. if column == "" {
  22. column = "[UNKNOWN COLUMN]"
  23. }
  24. //if tableAlia != "" {
  25. // column = fmt.Sprintf("%s.%s", tableAlia, column)
  26. //}
  27. var sqlOrder, strDistinct string
  28. if hasDistinct {
  29. strDistinct = "DISTINCT"
  30. }
  31. if columnOrder && orderField == "" {
  32. orderField = column
  33. }
  34. switch dbDriver {
  35. case DM:
  36. if columnOrder {
  37. sqlOrder = fmt.Sprintf("WITHIN GROUP (ORDER BY %s %s)", orderField, orderRule)
  38. }
  39. sqlStr = fmt.Sprintf("LISTAGG(%s %s, '%s') %s", strDistinct, column, delimiter, sqlOrder)
  40. default:
  41. // 默认使用MySQL的语法
  42. if columnOrder {
  43. sqlOrder = fmt.Sprintf("ORDER BY %s %s", orderField, orderRule)
  44. }
  45. sqlStr = fmt.Sprintf("GROUP_CONCAT(%s %s %s SEPARATOR '%s')", strDistinct, column, sqlOrder, delimiter)
  46. }
  47. return sqlStr
  48. }
  49. func GroupUnitDistinctFunc(driver string, column, delimiter string) (sqlStr string) {
  50. dbDriver, _ := getDriverInstance(driver)
  51. if delimiter == "" {
  52. delimiter = ","
  53. }
  54. if column == "" {
  55. column = "[UNKNOWN COLUMN]"
  56. }
  57. //if tableAlia != "" {
  58. // column = fmt.Sprintf("%s.%s", tableAlia, column)
  59. //}
  60. switch dbDriver {
  61. case MySql:
  62. sqlStr = fmt.Sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR '%s')", column, delimiter)
  63. case DM:
  64. sqlStr = fmt.Sprintf("LISTAGG(DISTINCT %s, '%s') WITHIN GROUP (ORDER BY %s)", column, delimiter, column)
  65. default:
  66. sqlStr = fmt.Sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR '%s')", column, delimiter) // 默认使用 MySQL 的语法
  67. }
  68. return sqlStr
  69. }
  70. func getDriverInstance(driver string) (dbDriver Driver, err error) {
  71. if driver == "" {
  72. dbDriver = supportDriverMap[DbDriverName]
  73. }
  74. if currentDriver, ok := supportDriverMap[driver]; !ok {
  75. err = errors.New("不支持的数据库驱动类型")
  76. return
  77. } else {
  78. dbDriver = currentDriver
  79. }
  80. return
  81. }
  82. func NeedDateOrTimeFormat(driver string) bool {
  83. var dbDriver Driver
  84. if driver == "" {
  85. dbDriver = supportDriverMap[DbDriverName]
  86. } else {
  87. dbDriver, _ = getDriverInstance(driver)
  88. }
  89. if dbDriver == DM {
  90. return true
  91. }
  92. return false
  93. }
  94. func ReplaceDriverKeywords(driver string, sql string) string {
  95. dbDriver, _ := getDriverInstance(driver)
  96. rules := map[Driver]map[string]string{
  97. DM: {
  98. "admin": `"admin"`,
  99. "value": `"value"`,
  100. "exchange": `"exchange"`,
  101. },
  102. }
  103. replacements, ok := rules[dbDriver]
  104. if !ok {
  105. return sql
  106. }
  107. for keyword, replace := range replacements {
  108. // 仅替换单独的单词,复合单词含关键词不管
  109. pattern := fmt.Sprintf(`\b%s\b`, regexp.QuoteMeta(keyword))
  110. re := regexp.MustCompile(pattern)
  111. sql = re.ReplaceAllString(sql, replace)
  112. }
  113. return sql
  114. }