如何一起使用LISTAGG和WHERE

问题描述 投票:0回答:2

所以我在使用LISTAGG语句时尝试使用WHERE函数。我想要做的是搜索WHERE语句,LISTAGG返回一个与其他列关系的列表。

换句话说,当我在WHERE中使用LISTAGG语句时,我只获得了我正在搜索的值。与其他列关联的其他值不会显示。

我的脚本有点像这样:

WITH TEST AS 
  (
  SELECT DISTINCT
         LOCATION,
         ID,
         LISTAGG (TOMATOCOUNT, ', ') 
             WITHIN GROUP (ORDER BY TOMATOCOUNT) 
             OVER (PARTITION BY LOCATION, ID) TOMATOTYPES,

  FROM TOMATOLAND
  )

SELECT
*
FROM TEST
WHERE (:TOMATOTYPE = TOMATO
    OR :TOMATOTYPE IS NULL)
sql oracle where-clause listagg
2个回答
1
投票

过滤LISTAGG的结果打击我作为一些后缀。通常,如果您要将多个项目聚合到一个列表中,那么您将在最后一刻将其用于显示目的。理想情况下,您将在聚合之前进行过滤。

以下将为每个包含指定locationID / tomatotype返回一行。

SELECT DISTINCT
       location,
       id,
       LISTAGG (tomatotype, ', ')
           WITHIN GROUP (ORDER BY tomatocount)
           OVER (PARTITION BY location, id)
           tomatotypes
FROM   tomatoland
WHERE  (location, id) IN (SELECT location, id
                          FROM   tomatoland
                          WHERE  :tomatotype = tomatotype)
       OR  :tomatotype IS NULL

0
投票

我想你想要这样的东西:

WITH TEST AS (
      SELECT LOCATION, ID,
             LISTAGG(TOMATOTYPE, ', ') WITHIN GROUP (ORDER BY TOMATOCOUNT) OVER (PARTITION BY LOCATION, ID) as TOMATOTYPES
      FROM TOMATOLAND
     )
SELECT *
FROM TEST
WHERE ', ' || :TOMATOTYPE || ', ' LIKE '%,' || TOMATOTYPES || ', %' OR
      :TOMATOTYPE IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.