加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 在DB2中拆分VARCHAR以检索其中的值

发布时间:2020-12-12 07:04:39 所属栏目:MsSql教程 来源:网络整理
导读:我有一个VARCHAR列,其中包含5个以’$’分隔的信息(2个CHAR(3)和3个TIMESTAMP). CREATE TABLE MYTABLE ( COL VARCHAR(256) NOT NULL);INSERT INTO MYTABLE VALUES ( 'AAA$000$2009-10-10 10:50:00$null$null$null' ),( 'AAB$020$2007-04-10 10:50:00$null$null
我有一个VARCHAR列,其中包含5个以’$’分隔的信息(2个CHAR(3)和3个TIMESTAMP).
CREATE TABLE MYTABLE (
  COL VARCHAR(256) NOT NULL
);

INSERT INTO MYTABLE 
VALUES
    ( 'AAA$000$2009-10-10 10:50:00$null$null$null' ),( 'AAB$020$2007-04-10 10:50:00$null$null$null' ),( 'AAC$780$null$2007-04-10 10:50:00$2009-04-10 10:50:00$null' )
;

我想提取第4场……

'AAA$000$2009-10-10 10:50:00$null$null$null'
                             ^^^^ this field

……有类似的东西

SELECT SPLIT(COL,'$',4) FROM MYTABLE

1
-----
'null'
'null'
'2009-04-10 10:50:00'

我按顺序搜索:

> DB2内置字符串函数
>可嵌入的声明,如SUBSTR(COL,POSSTR(COL)1)……
>用户定义的函数,其行为类似于SPLIT

精度:是的,我知道拥有这样的专栏并不是一个好主意……

解决方法

CREATE FUNCTION split(pos INT,delimeter CHAR,string VARCHAR(255))
LANGUAGE SQL
RETURNS VARCHAR(255)
DETERMINISTIC NO EXTERNAL ACTION
BEGIN ATOMIC
    DECLARE x INT;
    DECLARE s INT;
    DECLARE e INT;

    SET x = 0;
    SET s = 0;
    SET e = 0;

    WHILE (x < pos) DO
        SET s = locate(delimeter,string,s + 1);
        IF s = 0 THEN
            RETURN NULL;
        END IF;
        SET x = x + 1;
    END WHILE;

    SET e = locate(delimeter,s + 1);
    IF s >= e THEN
        SET e = LENGTH(string) + 1;
    END IF;
    RETURN SUBSTR(string,s + 1,e - s -1);
END!

用法:

SELECT split(3,col) from mytable; -- or
SELECT split(0,'-','first-second-third') from sysibm.sysdummy1;
SELECT split(0,'returns this') from sysibm.sysdummy1;
SELECT split(1,'returns null') from sysibm.sysdummy1;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读