Sql Oracle中如何将垂直字符串转换为水平字符串

Sql Oracle中如何将垂直字符串转换为水平字符串,sql,database,oracle,Sql,Database,Oracle,O N K A. R 如何将其转换为ONKAR。相反,我知道。但是我无法解决这个问题。如果没有第二列提供每个字母的顺序,您通常无法做您想要做的事情。假设您确实有一个职位栏,我们可以尝试: SELECT LISTAGG(letter, '') WITHIN GROUP (ORDER BY position) word FROM yourTable; 数据: letter | position O | 1 N | 2 K | 3 A | 4 R


O
N
K
A.
R

如何将其转换为
ONKAR
。相反,我知道。但是我无法解决这个问题。

如果没有第二列提供每个字母的顺序,您通常无法做您想要做的事情。假设您确实有一个职位栏,我们可以尝试:

SELECT LISTAGG(letter, '') WITHIN GROUP (ORDER BY position) word
FROM yourTable;

数据:

letter | position
O      | 1
N      | 2
K      | 3
A      | 4
R      | 5

Listag是最长4000字节字符串的正确解决方案,因为它返回varchar2数据类型。但对于较长的字符串,您可能会得到clob数据类型

with s (letter, position) as (
select 'O', 1 from dual union all
select 'N', 2 from dual union all
select 'K', 3 from dual union all
select 'A', 4 from dual union all
select 'R', 5 from dual)
select xmlcast(xmlagg(xmlelement(x, letter) order by position) as clob) c
from s;

C              
---------------
ONKAR

只要数据结果中有所有要粘在一起的行,就可以使用此选项

with data as (select 'O' as  letter from dual
              union all
              select 'N' from dual
              union all
              select 'K' from dual
              union all
              select 'A' from dual
              union all
              select 'R' from dual)
SELECT LISTAGG(letter, '') WITHIN GROUP (ORDER BY rownum)
FROM data;

如果数据位于由换行符(ASCII 13)分隔的单行中,则可以使用
REPLACE(value,CHR(13))

Oracle安装程序

CREATE TABLE test_data ( value ) AS
SELECT 'O' || CHR(13) || 'N' || CHR(13) || 'K' || CHR(13) || 'A' || CHR(13) || 'R' FROM DUAL
SELECT value, REPLACE( value, CHR(13) ) FROM test_data
VALUE | REPLACE(VALUE,CHR(13)) :-------- | :--------------------- O | ONKAR N | K | A | R | 查询

CREATE TABLE test_data ( value ) AS
SELECT 'O' || CHR(13) || 'N' || CHR(13) || 'K' || CHR(13) || 'A' || CHR(13) || 'R' FROM DUAL
SELECT value, REPLACE( value, CHR(13) ) FROM test_data
VALUE | REPLACE(VALUE,CHR(13)) :-------- | :--------------------- O | ONKAR N | K | A | R | 输出

CREATE TABLE test_data ( value ) AS
SELECT 'O' || CHR(13) || 'N' || CHR(13) || 'K' || CHR(13) || 'A' || CHR(13) || 'R' FROM DUAL
SELECT value, REPLACE( value, CHR(13) ) FROM test_data
VALUE | REPLACE(VALUE,CHR(13)) :-------- | :--------------------- O | ONKAR N | K | A | R | 值|替换(值,CHR(13)) :-------- | :--------------------- 奥昂卡尔 N| K| A| R| dbfiddle

嗨,试试[LISTAGG]你说的“垂直字符串”到底是什么意思?您是在显示表中的行,还是在列的单行中?