当前位置: 首页 > 面试题库 >

在Oracle中生成串联字符串的快速方法

公孙俊弼
2023-03-14
问题内容

当邪恶的编码再次困扰时,我们不讨厌吗?

前段时间,我需要生成一个字符串,将某些字段连接起来,以便稍后进行更多处理。我认为如果直接查询将是一个好主意,并使用SO的帮助来获取它。有效。一阵子…

桌子变得很大,现在这种技巧(我知道效率极低)并不完全可行。这是我在做什么:

with my_tabe as
(
    select 'user1' as usrid, '1' as prodcode from dual union
    select 'user1' as usrid, '2' as prodcode from dual union
    select 'user1' as usrid, '3' as prodcode from dual union
    select 'user2' as usrid, '2' as prodcode from dual union
    select 'user2' as usrid, '3' as prodcode from dual union
    select 'user2' as usrid, '4' as prodcode from dual
)
select
    usrid,
    ltrim(sys_connect_by_path(prodcode, '|'), '|') as prodcode
from 
    (
    select distinct prodcode, usrid,count(1)
    over (partition by usrid) as cnt,
    row_number() over (partition by usrid order by prodcode) as rn
    from my_tabe 
    )
where
    rn = cnt 
start with rn = 1
connect by prior rn + 1 = rn
and prior usrid = usrid

很好地产生:

USRID   PRODCODE
user1   1|2|3
user2   2|3|4

您可能已经注意到,这里的邪恶之处在于where rn = cnt,如果将其删除,您将看到Oracle真正在做的所有工作(我想):

USRID   PRODCODE
user1   1
user1   1|2
user1   1|2|3
user2   2
user2   2|3
user2   2|3|4

实际上,我在很多没有很多记录的地方都使用了此功能。多达五十万条记录是非常好的。

最近,我在具有〜15Mi记录的表中尝试了同样的操作,嗯…不好。

问题:是否有办法在Oracle上更有效地执行此操作,还是该将其归结为实际代码了?这不是实际的核心问题,因此,只要速度很快,我仍然可以负担得起。值得一提的是,我正在使用的“
usrid”列有一个索引。

干杯,


问题答案:

Tom
Kyte
提供了一种非常方便的方法来实现此目的,并且它从Oracle
9i开始具有自定义聚合功能。它使用逗号聚合,但是您可以修改管道的功能主体。

从Oracle 11g开始,您可以执行以下操作:

SELECT LISTAGG(column, separator) WITHIN GROUP (ORDER BY field)
  FROM dataSource
 GROUP BY grouping columns

该网页提供了其他方法,包括您列出的方法,但实际上效率不高。



 类似资料:
  • 问题内容: 我从html解析中得到一个字符串,即 我的代码是这样的 我不确定我的第二个拆分字符串应该是“’”还是“’,” 我希望我的结果是 问题答案: 我将使用正则表达式从这样的复杂输入中提取子字符串。 Swift 3.1: Swift 2.0:

  • 问题内容: 我曾尝试打印它,但由于它是转义字符,因此只是通过而已。例如,输出应如下。 提前致谢 问题答案: 为此以及将来的参考:

  • 问题内容: (假设php5)考虑 1和2之间有很大的区别吗? 如果不是,那介于1/2和3之间呢? 问题答案: 好吧,就像所有“现实生活中可能更快”的问题一样,您无法击败现实生活中的考验。 进行几次运行以分页显示所有内容,然后… 0.0035568 0.0035388 0.0025394 因此,正如预期的那样,插值实际上是相同的(噪声级别差异,可能是由于插值引擎需要处理的额外字符)。直接串联的速度约

  • 问题内容: 为什么下面的工作?我希望会被抛出。 问题答案: 为什么必须起作用? 在JLS 5,第15.18.1.1节 JLS 8§15.18.1 “字符串连接运算符+” ,导致JLS 8,§5.1.11 “字符串转换”,要求该操作无故障成功: …现在只需要考虑参考值。如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。否则,转换的执行就好像是通过调用不带参数的

  • 问题内容: 我有2列的大型表格:Id和Title。ID为bigint,我可以自由选择“标题”列的类型:varchar,char,text等。列标题包含随机文本字符串,例如“ abcdefg”,“ q”,“ allyourbasebelongtous”,最多255个字符。 我的任务是通过给定的子字符串获取字符串。子字符串也具有随机长度,可以是字符串的开头,中间或结尾。最明显的执行方式: 我不在乎IN

  • 我需要在一个字符串中找到许多子字符串。我下载了一个网页并把它放入一个字符串中。然后我要看看页面是否包含一些字符串(子字符串)。 现在我在boost库中使用正则表达式,因为我使用它来使用正则表达式模式([0-9]等)。 问题是:如果我只需要在一个字符串中找到一个子字符串,哪种方法是最快的?