🧩 今日话题
阅读完本篇需要6分钟
“计算机是无用的。它们只能给你答案。” —— 巴勃罗·毕加索
-
🧩 今日话题
-
🔍 问题解决
-
💡 ✦话题延申✦
-
👻 那么在 PostgreSQL 里面怎么实现呢?
-
👻 那么在 SQL Server 里面呢?
-
👻 在 Oracle 里面的实现方式:
Q: 有一个由逗号分隔的name
组成的字段,如'MeiJuan,Jerry,Tom,Sam,Tim,Jack'
,在MySQL
中怎么通过SQL
获取第n
个位置的名字呢?
🔍 问题解决
select @str:='MeiJuan,Jerry,Tom,Sam,Tim,Jack';
select @sbp:=',';
新手会怎么写呢?可能会复杂化,这样写:
比如获取第3
个名字。
select @num:=3;
select
@str,
if(@num=1,
substring_index(@str,@sbp,@num),
if(@num>(length(@str)-length(replace(@str,@sbp,''))+1),
'error',
substr(substring_index(@str,@sbp,@num),
length(substring_index(@str,@sbp,@num-1))+2))
)
as spec_name
from dual;
-- result:
|@str |spec_name|
|------------------------------|---------|
|MeiJuan,Jerry,Tom,Sam,Tim,Jack|Tom |
比较熟练的人会怎么写呢?
select @str, substring_index(substring_index( @str, ',', 3), ',', -1) as spec_name;
-- result:
|@str |spec_name|
|------------------------------|---------|
|MeiJuan,Jerry,Tom,Sam,Tim,Jack|Tom |
其实主要还是对substring_index
的熟练程序,第一次substring_index
返回了, 第三次出现位置左边的子串,第二次使用substring_index
使用-1
返回了从右到左的第1
次出现的位置。所以就可以很快地获取指定位置的名字。
💡 ✦话题延申✦
👻 那么在 PostgreSQL 里面怎么实现呢?
其实在pg
里面最简单,有现成的函数。
select split_part('meijuan,jerry,tom,sam,tim,jack', ',', 3) as spec_name;
-- result
|spec_name|
|---------|
|Tom |
👻 那么在 SQL Server 里面呢?
当然了,你也可以不用声明变量,直接带入查询,和其他数据库比较简单程度
DECLARE @str NVARCHAR(MAX) = 'MeiJuan,Jerry,Tom,Sam,Tim,Jack';
DECLARE @delimiter CHAR(1) = ',';
DECLARE @n INT = 3; -- Change this to get the nth value
WITH Split(st, value) AS (
SELECT
CAST('<X>' + REPLACE(@str, @delimiter, '</X><X>') + '</X>' AS XML) AS st,
@n AS value
)
SELECT
N.value('/X[sql:column("value")][1]', 'NVARCHAR(MAX)') AS specName
FROM Split
CROSS APPLY st.nodes('/') AS T(N);
-- result
|spec_name|
|---------|
|Tom |
👻 在 Oracle 里面的实现方式:
DECLARE
v_str VARCHAR2(100) := 'MeiJuan,Jerry,Tom,Sam,Tim,Jack';
v_delimiter CHAR(1) := ',';
v_n INT := 3;
v_result VARCHAR2(100);
BEGIN
SELECT REGEXP_SUBSTR(v_str, '([^' || v_delimiter || ']+)', 1, v_n)
INTO v_result
FROM DUAL;
DBMS_OUTPUT.PUT_LINE(v_result);
END;
-- result
Statement processed.
Tom
今天就到这里了,再见~
原文始发于微信公众号(小新数据库):SQL训练日#1:按指定符号分割字符串
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/207573.html