【问题标题】:SELECT result in a single row [duplicate]SELECT 结果为单行[重复]
【发布时间】:2019-11-06 00:51:29
【问题描述】:

我试图在一个表中显示所有列的名称,在一行中用逗号分隔,然后将它们保存在一个变量中。

哪种方法最好?

我有这样的东西:

SELECT tab.column_name || decode(lead(tab.column_name,1) over (order by tab.column_id),null,'',',')
FROM
    all_tab_columns tab,
    all_constraints pk,
    all_cons_columns pk_det
WHERE
    tab.table_name = pk.table_name (+)
    and pk.table_name = pk_det.table_name (+)
    and tab.owner = pk.owner (+)
    and pk.owner = pk_det.owner (+)
    and pk.constraint_name = pk_det.constraint_name (+)
    and tab.column_name = pk_det.column_name (+)
    and tab.data_type not like '%LOB%'
    and tab.owner = :OWNER_SOURCE
    and tab.table_name = :TABLE_NAME_SOURCE

结果是这样的:

ID,
_LOCALE,
LABEL,
OBSERVATIONS

但是...我需要这种方式:

ID,_LOCALE,LABEL,OBSERVATIONS

提前致谢。

【问题讨论】:

标签: sql oracle string-aggregation


【解决方案1】:

您可以使用 substring 函数。请参阅下面有关如何将行连接成一行的示例代码

select SUBSTRING
 (( 
    SELECT ', ' + s.Column_name
    FROM INFORMATION_SCHEMA.COLUMNS AS s
    WHERE TABLE_NAME = N'TBLACCESS'
    FOR XML PATH('')
 ), 2, 1000)

如果你想保存在变量中。只需在子字符串中添加变量名即可。

select @myvariable=SUBSTRING
 (( 
    SELECT ', ' + s.Column_name
    FROM INFORMATION_SCHEMA.COLUMNS AS s
    WHERE TABLE_NAME = N'TBLACCESS'
    FOR XML PATH('')
 ), 2, 1000)

【讨论】:

  • 感谢@Vic 的回答,但我使用了函数 LISTAGG 并且它有效。
猜你喜欢
  • 2016-01-28
  • 2018-04-19
  • 2011-11-30
  • 1970-01-01
  • 2012-03-12
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多