【发布时间】:2020-12-08 17:32:40
【问题描述】:
我在 Oracle SQL 表中有一个字符串字段值。是否有任何查询,以便我可以将字符串拆分为新行,每行中有一定数量的相等字符,底部有多余的字符?
eg- ABCDEFGHIJ
我希望每行字符数相等的行 4 如下
ABCD
EFGH
IJ
2 个字母的其余部分应位于底部。是否可以使用 Oracle sql 查询来实现这一点?
【问题讨论】:
标签: sql string oracle split newline
我在 Oracle SQL 表中有一个字符串字段值。是否有任何查询,以便我可以将字符串拆分为新行,每行中有一定数量的相等字符,底部有多余的字符?
eg- ABCDEFGHIJ
我希望每行字符数相等的行 4 如下
ABCD
EFGH
IJ
2 个字母的其余部分应位于底部。是否可以使用 Oracle sql 查询来实现这一点?
【问题讨论】:
标签: sql string oracle split newline
您可以根据字符串的长度使用如下查询,使用 CONNECT BY 和 LEVEL。
WITH d AS (SELECT 'ABCDEFGHIJ' AS str FROM DUAL)
SELECT SUBSTR (str, ((LEVEL - 1) * 4) + 1, 4) AS four_letters
FROM d
CONNECT BY LEVEL < (LENGTH (str) / 4) + 1;
【讨论】:
如果您有多行,您可以将OUTER APPLY 与分层查询一起使用:
SELECT s.split_value,
s.position
FROM table_name t
OUTER APPLY (
SELECT LEVEL AS position,
SUBSTR( t.value, 4 * LEVEL - 3, 4 ) AS split_value
FROM DUAL
CONNECT BY LEVEL <= CEIL( LENGTH( t.value ) / 4 )
) s
其中,对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT 'ABCDEFGHIJ' FROM DUAL UNION ALL
SELECT '123456789012' FROM DUAL;
输出:
分割值 |位置 :------------ | --------: ABCD | 1 EFGH | 2 IJ | 3 第1234章1 5678 | 2 9012 | 3
db小提琴here
如果我想在一行中有 36 个
words个字符,我该如何修改您的第一个答案?
SELECT s.split_value,
s.position
FROM table_name t
OUTER APPLY (
SELECT LEVEL AS position,
SUBSTR( t.value, 36 * ( LEVEL - 1 ) + 1, 36 ) AS split_value
FROM DUAL
CONNECT BY LEVEL <= CEIL( LENGTH( t.value ) / 36 )
) s
其中,对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT 'ABCDEFGHIJ' FROM DUAL UNION ALL
SELECT '________10________20________30________40________50________60________70________80' FROM DUAL;
输出:
分割值 |位置 :------------------------------------------------ | --------: ABCDEFGHIJ | 1 ________10________20________30______ | 1 __40________50________60________70__ | 2 ______80 | 3
db小提琴here
【讨论】: