SQL训练日#1:按指定符号分割字符串

🧩 今日话题

阅读完本篇需要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), ','-1as 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'','3as 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, valueAS (
    SELECT 
        CAST('<X>' + REPLACE(@str, @delimiter, '</X><X>') + '</X>' AS XMLAS 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!