在oracle sql中将行数据转换为列数据
例如:有一个包含一列的表,其中包含像在oracle sql中将行数据转换为列数据,sql,oracle,Sql,Oracle,例如:有一个包含一列的表,其中包含像common这样的数据,我想将其显示为 c o m m o n 对于已发布的示例数据,您可以: select substr(col1, level, 1) from t23 connect by level <= length(col1) / 选择substr(列1,级别1) 从t23开始 按级别连接 Oracle 11g R2架构设置: CREATE TABLE table_name( value ) AS SELECT 'common' FROM
common
这样的数据,我想将其显示为
c
o
m
m
o
n
对于已发布的示例数据,您可以:
select substr(col1, level, 1)
from t23
connect by level <= length(col1)
/
选择substr(列1,级别1)
从t23开始
按级别连接
Oracle 11g R2架构设置:
CREATE TABLE table_name( value ) AS
SELECT 'common' FROM DUAL UNION ALL
SELECT 'string' FROM DUAL;
SELECT REGEXP_REPLACE(
value,
'(.)',
'\1' || CHR(10)
)
FROM table_name
| REGEXP_REPLACE(VALUE,'(.)','\1'||CHR(10)) |
|-------------------------------------------|
| c |
| o |
| m |
| m |
| o |
| n |
| |
| s |
| t |
| r |
| i |
| n |
| g |
| |
WITH characters ( value, character, lvl ) AS (
SELECT value, SUBSTR( value, 1, 1 ), 1 FROM table_name
UNION ALL
SELECT value, SUBSTR( value, lvl + 1, 1 ), lvl + 1
FROM characters
WHERE lvl < LENGTH( value )
)
SELECT character
FROM characters
ORDER BY value, lvl
| CHARACTER |
|-----------|
| c |
| o |
| m |
| m |
| o |
| n |
| s |
| t |
| r |
| i |
| n |
| g |
查询1:
CREATE TABLE table_name( value ) AS
SELECT 'common' FROM DUAL UNION ALL
SELECT 'string' FROM DUAL;
SELECT REGEXP_REPLACE(
value,
'(.)',
'\1' || CHR(10)
)
FROM table_name
| REGEXP_REPLACE(VALUE,'(.)','\1'||CHR(10)) |
|-------------------------------------------|
| c |
| o |
| m |
| m |
| o |
| n |
| |
| s |
| t |
| r |
| i |
| n |
| g |
| |
WITH characters ( value, character, lvl ) AS (
SELECT value, SUBSTR( value, 1, 1 ), 1 FROM table_name
UNION ALL
SELECT value, SUBSTR( value, lvl + 1, 1 ), lvl + 1
FROM characters
WHERE lvl < LENGTH( value )
)
SELECT character
FROM characters
ORDER BY value, lvl
| CHARACTER |
|-----------|
| c |
| o |
| m |
| m |
| o |
| n |
| s |
| t |
| r |
| i |
| n |
| g |
:
CREATE TABLE table_name( value ) AS
SELECT 'common' FROM DUAL UNION ALL
SELECT 'string' FROM DUAL;
SELECT REGEXP_REPLACE(
value,
'(.)',
'\1' || CHR(10)
)
FROM table_name
| REGEXP_REPLACE(VALUE,'(.)','\1'||CHR(10)) |
|-------------------------------------------|
| c |
| o |
| m |
| m |
| o |
| n |
| |
| s |
| t |
| r |
| i |
| n |
| g |
| |
WITH characters ( value, character, lvl ) AS (
SELECT value, SUBSTR( value, 1, 1 ), 1 FROM table_name
UNION ALL
SELECT value, SUBSTR( value, lvl + 1, 1 ), lvl + 1
FROM characters
WHERE lvl < LENGTH( value )
)
SELECT character
FROM characters
ORDER BY value, lvl
| CHARACTER |
|-----------|
| c |
| o |
| m |
| m |
| o |
| n |
| s |
| t |
| r |
| i |
| n |
| g |
(如果需要,请使用TRIM
删除尾随的换行符。)
查询2:
CREATE TABLE table_name( value ) AS
SELECT 'common' FROM DUAL UNION ALL
SELECT 'string' FROM DUAL;
SELECT REGEXP_REPLACE(
value,
'(.)',
'\1' || CHR(10)
)
FROM table_name
| REGEXP_REPLACE(VALUE,'(.)','\1'||CHR(10)) |
|-------------------------------------------|
| c |
| o |
| m |
| m |
| o |
| n |
| |
| s |
| t |
| r |
| i |
| n |
| g |
| |
WITH characters ( value, character, lvl ) AS (
SELECT value, SUBSTR( value, 1, 1 ), 1 FROM table_name
UNION ALL
SELECT value, SUBSTR( value, lvl + 1, 1 ), lvl + 1
FROM characters
WHERE lvl < LENGTH( value )
)
SELECT character
FROM characters
ORDER BY value, lvl
| CHARACTER |
|-----------|
| c |
| o |
| m |
| m |
| o |
| n |
| s |
| t |
| r |
| i |
| n |
| g |
您需要更清楚地了解此主题如果表中有多行,则此选项无效(分层查询将创建指数数量的重复行,因为没有任何限制层次结构的每个级别仅与其父级关联,因此它将其与所有可能的父级关联,从而创建许多重复)@MT0-你的评论非常正确。这就是为什么我在我的答案前面加上了发布的示例数据:)@APC:非常感谢。第一个解决方案不会生成多行,而是用换行符来伪造它们。但是递归WITH解决方案工作得很好。@APC OP在说“我想把它显示为…”时不清楚他们的要求。他们可能希望每个字符都在一个单独的行中,也可能只希望换行符中的每个字符都在同一行中(两者都提供OP POST的输出)。