【问题标题】:SELECT Values from Varray ORACLE SQL从 Varray ORACLE SQL 中选择值
【发布时间】:2018-06-14 04:23:39
【问题描述】:

我正在使用 apex.oracle,我得到的错误是 [unsupported data type]。 解释:我有一个名为 Playlist 的表,我想将一组歌曲存储到 Songs 字段中。出于这个原因,我定义了一个名为 PlaylistSongs 的 varray 的 chars 的类型。插入有效,但是当我执行 SELECT 时,我得到 [unsupported data type] 而不是我的数组值。

这里是代码

CREATE OR REPLACE TYPE PlaylistSongs AS VARRAY(4) OF CHAR(16);

CREATE TABLE PLAYLIST (
    IDPlaylist              NUMBER(4) NOT NULL,
    PlaylistName            CHAR(64),
    PlaylistAuthor          NUMBER(2),
    PlaylistDuration        NUMBER,
    ActivePlaylist          NUMBER(1),
    Songs                   PlaylistSongs,

    CONSTRAINT PLAYLIST_PRIMARY_KEY PRIMARY KEY (IDPlaylist),
    CONSTRAINT PLAYLIST_FOREIGN_KEY FOREIGN KEY (PlaylistAuthor) REFERENCES DJ (IDDJ)
);

INSERT INTO PLAYLIST VALUES (1, 'Rap', 1, 153, 1, 1, PlaylistSongs('River', 'Lose Yourself', 'Till I Collapse', 'Walk On Water')); 

经过一番研究,我找到了TABLE 运算符。

SELECT *
FROM PLAYLIST p, TABLE(p.Songs) ps

这可行,但不是将数组显示为常规数组,而是在新行上显示每个条目。

我需要它看起来像 ['River', 'Lose Yourself', 'Till I Collapse', 'Walk On Water']。能做到吗?

【问题讨论】:

  • 是的 - 请参阅 listagg()。此外,将varchar2 用于字符串,而不是char,它应用您不需要的空白填充(实际上,没有人需要它 - char 仅用于可移植性和 ANSI 完整性,不适用于新开发) .
  • 你是英雄。谢谢!这是以防万一有人需要的解决方案:SELECT PlaylistName, LISTAGG(column_value, ', ') WITHIN GROUP(ORDER BY column_value) as "Playlist" FROM Playlist, TABLE(Songs) GROUP BY PlaylistName
  • 谢谢 - 我已经把我的评论变成了答案。

标签: sql oracle varray


【解决方案1】:

是的 - 请参阅 listagg() 聚合函数(与 group by 子句一起使用):

select idplaylist
     , playlistname
     , playlistauthor
     , playlistduration
     , activeplaylist
     , listagg(rtrim(ps.column_value), ', ') within group (order by ps.column_value) as songs
from   playlist p
       cross join table(p.songs) ps
group by
       idplaylist
     , playlistname
     , playlistauthor
     , playlistduration
     , activeplaylist;

另外,use varchar2 for strings, not char 仅应用您不需要的空白填充(实际上,没有人需要它 - char 仅用于可移植性和 ANSI 完整性,不适用于新开发。使用 varchar2 数组你不需要rtrim()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多