Oracle兼容-函数-WM_CONCAT()函数


1. 语法

  1. WM_CONCAT([DISTINCT] expr,... [ORDER BY col [ASC|DESC],...]
  2. [SEPARATOR str_const])

2. 定义和用法

WM_CONCAT(expr) 函数的作用是从 expr 中连接所有非NULL的字符串。如果没有非NULL的字符串,那么它就会返回NULL。

用法:WM_CONCAT([DISTINCt] 要连接的字段列表 [ORDER BY 排序字段 ASC|DESC ] [SEPARATOR '分隔符'])

3. Oracle兼容说明

  • WM_CONCAT() 是一个聚合函数,在Oracle 10g推出,在10g版本中,返回字符串类型,在11g版本中返回clob类型,在12c后已取消该函数。在Oracle中,该函数是一个undocumented function(未公开函数)),Oracle官方不推荐使用的函数。
  • 从网络公开资料中并未看到Oracle的 WM_CONCAT() 函数支持 ORDER BY 子句。而GreatSQL的 WM_CONCAT() 函数是支持 ORDER BY 子句的。
  • 在Windowing(窗口函数用法)环境中,OVER() 内的 ORDER BY 子句,与 WM_CONCAT() 中的 ORDER BY 子句不可同时出现。
  • WM_CONCAT() 中没有 ORDER BY 子句时,允许在 OVER() 内使用 ORDER BY 子句;当 OVER() 中使用 ORDER BY 子句时,会将 ORDER BY 视为 PARTITION 的一部分;WM_CONCAT() 内使用 ORDER BY 时则是单纯的将结果排序。

4. 示例

  1. greatsql> CREATE TABLE t1 (
  2. grp INT,
  3. a BIGINT UNSIGNED,
  4. c CHAR(10) NOT NULL,
  5. d CHAR(10) NOT NULL
  6. );
  7. greatsql> INSERT INTO t1 VALUES (1,1,"a","a"),
  8. (2,2,"b","a"),
  9. (2,3,"c","b"),
  10. (3,4,"E","a"),
  11. (3,5,"C","b");
  12. greatsql> SELECT * FROM t1;
  13. +------+------+---+---+
  14. | grp | a | c | d |
  15. +------+------+---+---+
  16. | 1 | 1 | a | a |
  17. | 2 | 2 | b | a |
  18. | 2 | 3 | c | b |
  19. | 3 | 4 | E | a |
  20. | 3 | 5 | C | b |
  21. +------+------+---+---+
  22. greatsql> SELECT WM_CONCAT(c) FROM t1;
  23. +--------------+
  24. | WM_CONCAT(c) |
  25. +--------------+
  26. | a,b,c,E,C |
  27. +--------------+
  28. greatsql> SELECT REPLACE(WM_CONCAT(c),',','|') FROM t1;
  29. +-------------------------------+
  30. | REPLACE(WM_CONCAT(c),',','|') |
  31. +-------------------------------+
  32. | a|b|c|E|C |
  33. +-------------------------------+
  34. greatsql> SELECT grp, WM_CONCAT(c) c FROM t1 GROUP BY grp;
  35. +------+------+
  36. | grp | c |
  37. +------+------+
  38. | 1 | a |
  39. | 2 | b,c |
  40. | 3 | E,C |
  41. +------+------+
  42. greatsql> SELECT grp, WM_CONCAT(DISTINCT c ORDER BY c DESC) FROM t1 GROUP BY grp;
  43. +------+---------------------------------------+
  44. | grp | WM_CONCAT(DISTINCT c ORDER BY c DESC) |
  45. +------+---------------------------------------+
  46. | 1 | a |
  47. | 2 | c,b |
  48. | 3 | E,C |
  49. +------+---------------------------------------+
  50. greatsql> SELECT grp, WM_CONCAT(DISTINCT c ORDER BY c DESC) OVER (PARTITION BY grp) FROM t1;
  51. +------+---------------------------------------------------------------+
  52. | grp | WM_CONCAT(DISTINCT c ORDER BY c DESC) OVER (PARTITION BY grp) |
  53. +------+---------------------------------------------------------------+
  54. | 1 | a |
  55. | 2 | c,b |
  56. | 2 | c,b |
  57. | 3 | E,C |
  58. | 3 | E,C |
  59. +------+---------------------------------------------------------------+
  60. greatsql> SELECT grp, WM_CONCAT(DISTINCT c) OVER (PARTITION BY grp ORDER BY c DESC) FROM t1;
  61. +------+---------------------------------------------------------------+
  62. | grp | WM_CONCAT(DISTINCT c) OVER (PARTITION BY grp ORDER BY c DESC) |
  63. +------+---------------------------------------------------------------+
  64. | 1 | a |
  65. | 2 | c |
  66. | 2 | c,b |
  67. | 3 | E |
  68. | 3 | E,C |
  69. +------+---------------------------------------------------------------+
  70. greatsql> EXPLAIN SELECT grp, WM_CONCAT(DISTINCT c ORDER BY c DESC) OVER (PARTITION BY grp) FROM t1;
  71. greatsql> SHOW WARNINGS\G
  72. *************************** 1. row ***************************
  73. Level: Note
  74. Code: 3598
  75. Message: To get information about window functions use EXPLAIN FORMAT=JSON
  76. *************************** 2. row ***************************
  77. Level: Note
  78. Code: 1003
  79. Message: /* select#1 */ select `greatsql`.`t1`.`grp` AS `grp`,wm_concat(distinct `greatsql`.`t1`.`c` order by `greatsql`.`t1`.`c` desc separator ',') OVER (PARTITION BY `greatsql`.`t1`.`grp` ) AS `WM_CONCAT(DISTINCT c ORDER BY c DESC) OVER (PARTITION BY grp)` from `greatsql`.`t1`
  80. greatsql> EXPLAIN SELECT grp, WM_CONCAT(DISTINCT c) OVER (PARTITION BY grp ORDER BY c DESC) FROM t1;
  81. greatsql> SHOW WARNINGS\G
  82. *************************** 1. row ***************************
  83. Level: Note
  84. Code: 3598
  85. Message: To get information about window functions use EXPLAIN FORMAT=JSON
  86. *************************** 2. row ***************************
  87. Level: Note
  88. Code: 1003
  89. Message: /* select#1 */ select `greatsql`.`t1`.`grp` AS `grp`,wm_concat(distinct `greatsql`.`t1`.`c` separator ',') OVER (PARTITION BY `greatsql`.`t1`.`grp` ORDER BY `greatsql`.`t1`.`c` desc ) AS `WM_CONCAT(DISTINCT c) OVER (PARTITION BY grp ORDER BY c DESC)` from `greatsql`.`t1`

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx