concat和concat_ws()區別及MySQL的幾個實用字符串函數【轉】
一、
concat
()
函數
1.1 MySQL的concat函數能夠鏈接一個或者多個字符串
,
如
mysql
>
select concat
(
'10'
);
+--------------+
|
concat
(
'10'
) |
+--------------+
|
10
|
+--------------+
1 row in set
(
0.00 sec
)
mysql
>
select concat
(
'11'
,
'22'
,
'33'
);
+------------------------+
|
concat
(
'11'
,
'22'
,
'33'
) |
+------------------------+
|
112233
|
+------------------------+
1 row in set
(
0.00 sec
)
而Oracle的concat函數只能鏈接兩個字符串
SQL
>
select concat
(
'11'
,
'22'
)
from dual
;
1.2 MySQL的concat函數在鏈接字符串的時候,只要其中一個是NULL
,
那麼將返回NULL
mysql
>
select concat
(
'11'
,
'22'
,
null
);
+------------------------+
|
concat
(
'11'
,
'22'
,
null
) |
+------------------------+
|
NULL
|
+------------------------+
1 row in set
(
0.00 sec
)
而Oracle的concat函數鏈接的時候,只要有一個字符串不是NULL
,
就不會返回NULL
SQL
>
select concat
(
'11'
,
NULL
)
from dual
;
CONCAT
--
11
二、concat_ws
()
函數
,
表示concat with separator
,
即有分隔符的字符串鏈接
如鏈接後以逗號分隔
mysql
>
select concat_ws
(
','
,
'11'
,
'22'
,
'33'
);
+-------------------------------+
|
concat_ws
(
','
,
'11'
,
'22'
,
'33'
) |
+-------------------------------+
|
11
,
22
,
33
|
+-------------------------------+
1 row in set
(
0.00 sec
)
和concat不一樣的是
,
concat_ws函數在執行的時候
,
不會由於NULL值而返回NULL
mysql
>
select concat_ws
(
','
,
'11'
,
'22'
,
NULL
);
+-------------------------------+
|
concat_ws
(
','
,
'11'
,
'22'
,
NULL
) |
+-------------------------------+
|
11
,
22
|
+-------------------------------+
1 row in set
(
0.00 sec
)
三、group_concat
()
可用來行轉列
,
Oracle沒有這樣的函數
完整的語法以下
group_concat
([
DISTINCT
]
要鏈接的字段
[
Order BY ASC
/
DESC 排序字段
] [
Separator
'分隔符'
])
以下例子
mysql
>
select
*
from aa
;
+------+------+
|
id
|
name
|
+------+------+
|
1
|
10
|
|
1
|
20
|
|
1
|
20
|
|
2
|
20
|
|
3
|
200
|
|
3
|
500
|
+------+------+
6 rows in set
(
0.00 sec
)
3.1 以id分組,把name字段的值打印在一行,逗號分隔
(
默認
)
mysql
>
select id
,
group_concat
(
name
)
from aa group by id
;
+------+--------------------+
|
id
|
group_concat
(
name
) |
+------+--------------------+
|
1
|
10
,
20
,
20
|
|
2
|
20
|
|
3
|
200
,
500
|
+------+--------------------+
3 rows in set
(
0.00 sec
)
3.2 以id分組,把name字段的值打印在一行,分號分隔
mysql
>
select id
,
group_concat
(
name separator
';'
)
from aa group by id
;
+------+----------------------------------+
|
id
|
group_concat
(
name separator
';'
) |
+------+----------------------------------+
|
1
|
10
;
20
;
20
|
|
2
|
20
|
|
3
|
200
;
500
|
+------+----------------------------------+
3 rows in set
(
0.00 sec
)
3.3 以id分組,把去冗餘的name字段的值打印在一行,逗號分隔
mysql
>
select id
,
group_concat
(
distinct name
)
from aa group by id
;
+------+-----------------------------+
|
id
|
group_concat
(
distinct name
) |
+------+-----------------------------+
|
1
|
10
,
20
|
|
2
|
20
|
|
3
|
200
,
500
|
+------+-----------------------------+
3 rows in set
(
0.00 sec
)
3.4 以id分組,把name字段的值打印在一行,逗號分隔
,
以name排倒序
mysql
>
select id
,
group_concat
(
name order by name desc
)
from aa group by id
;
+------+---------------------------------------+
|
id
|
group_concat
(
name order by name desc
) |
+------+---------------------------------------+
|
1
|
20
,
20
,
10
|
|
2
|
20
|
|
3
|
500
,
200
|
+------+---------------------------------------+
3 rows in set
(
0.00 sec
)
四、repeat
()
函數,用來複制字符串
,
以下
'ab'
表示要複製的字符串,2表示複製的份數
mysql
>
select repeat
(
'ab'
,
2
);
+----------------+
|
repeat
(
'ab'
,
2
) |
+----------------+
|
abab
|
+----------------+
1 row in set
(
0.00 sec
)
又如
mysql
>
select repeat
(
'a'
,
2
);
+---------------+
|
repeat
(
'a'
,
2
) |
+---------------+
|
aa
|
+---------------+
1 row in set
(
0.00 sec
)
歡迎關注本站公眾號,獲取更多信息