在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的输出)。