Sql 使用Oracle Listag函数添加编号项目符号

Sql 使用Oracle Listag函数添加编号项目符号,sql,oracle,listagg,Sql,Oracle,Listagg,是否可以使用Oracle的LISTAGG函数添加编号项目符号 i、 e: 我有一张桌子: PRODUCT_ID PRODUCT_NAME 1001 Bananas 1002 Apples 1003 Pears 1004 Oranges SQL语句: SELECT LISTAGG('*' || product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Pr

是否可以使用Oracle的LISTAGG函数添加编号项目符号

i、 e:

我有一张桌子:

PRODUCT_ID    PRODUCT_NAME
1001          Bananas
1002          Apples
1003          Pears
1004          Oranges
SQL语句:

SELECT LISTAGG('*' || product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Product_Listing"
FROM products;
*
是一个编号的项目符号,应产生ff:

1. Apples
2. Bananas
3. Oranges
4. Pears
另外,是否可以使用字母而不是数字?

您可以在子查询中使用row_number()来生成数字

with products as
(
select 1001 as product_id,  'Bananas' as product_name from dual union all
select 1002 as product_id,  'Apples' as product_name from dual union all
select 1003 as product_id,  'Pears' as product_name from dual union all
select 1004 as product_id,  'Oranges' as product_name from dual
)
SELECT LISTAGG(rn||'. '|| product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Product_Listing" 
FROM
   (SELECT product_id, product_name, row_number() over (order by product_name) as rn
      FROM products)
或rownum

SELECT LISTAGG(rownum||'. '|| product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Product_Listing" 
FROM
   (SELECT product_id, product_name
      FROM products
     ORDER BY product_name)
可以在子查询中使用row_number()生成数字

with products as
(
select 1001 as product_id,  'Bananas' as product_name from dual union all
select 1002 as product_id,  'Apples' as product_name from dual union all
select 1003 as product_id,  'Pears' as product_name from dual union all
select 1004 as product_id,  'Oranges' as product_name from dual
)
SELECT LISTAGG(rn||'. '|| product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Product_Listing" 
FROM
   (SELECT product_id, product_name, row_number() over (order by product_name) as rn
      FROM products)
或rownum

SELECT LISTAGG(rownum||'. '|| product_name, CHR(13)) WITHIN GROUP (ORDER BY product_name) "Product_Listing" 
FROM
   (SELECT product_id, product_name
      FROM products
     ORDER BY product_name)

Product\u Listing\u 1
为您提供数字项目符号,
Product\u Listing\u 2
为您提供字母项目符号

with products as (
    select 1001 as product_id, 'Bananas' as product_name from dual
    union all
    select 1002 as product_id, 'Apples' as product_name from dual
    union all
    select 1003 as product_id, 'Pears' as product_name from dual
    union all
    select 1004 as product_id, 'Oranges' as product_name from dual
),
make_bullets$ as (
    select X.*,
        row_number() over (partition by null order by product_name) as the_number_bullet,
        chr(ascii('a') - 1 + row_number() over (partition by null order by product_name)) as the_letter_bullet
    from products X
)
select
    listagg(the_number_bullet||'. '||product_name, chr(13)) within group (order by product_name) as "Product_Listing_1",
    listagg(the_letter_bullet||'. '||product_name, chr(13)) within group (order by product_name) as "Product_Listing_2"
from make_bullets$
;
结果:

Product_Listing_1    Product_Listing_2
-----------------    -----------------
1. Apples            a. Apples
2. Bananas           b. Bananas
3. Oranges           c. Oranges
4. Pears             d. Pears

Product\u Listing\u 1
为您提供数字项目符号,
Product\u Listing\u 2
为您提供字母项目符号

with products as (
    select 1001 as product_id, 'Bananas' as product_name from dual
    union all
    select 1002 as product_id, 'Apples' as product_name from dual
    union all
    select 1003 as product_id, 'Pears' as product_name from dual
    union all
    select 1004 as product_id, 'Oranges' as product_name from dual
),
make_bullets$ as (
    select X.*,
        row_number() over (partition by null order by product_name) as the_number_bullet,
        chr(ascii('a') - 1 + row_number() over (partition by null order by product_name)) as the_letter_bullet
    from products X
)
select
    listagg(the_number_bullet||'. '||product_name, chr(13)) within group (order by product_name) as "Product_Listing_1",
    listagg(the_letter_bullet||'. '||product_name, chr(13)) within group (order by product_name) as "Product_Listing_2"
from make_bullets$
;
结果:

Product_Listing_1    Product_Listing_2
-----------------    -----------------
1. Apples            a. Apples
2. Bananas           b. Bananas
3. Oranges           c. Oranges
4. Pears             d. Pears

我看不出有任何理由使用
listag
。Listag用于字符串聚合,您根本不需要聚合

您可以使用ROW_NUMBER()分析函数和串联运算符来获得所需的输出

比如说,

SQL> WITH DATA AS(
  2  SELECT 1001 PRODUCT_ID, 'Bananas' PRODUCT_NAME FROM dual UNION ALL
  3  SELECT 1002, 'Apples' FROM dual UNION ALL
  4  SELECT 1003, 'Pears' FROM dual UNION ALL
  5  SELECT 1004, 'Oranges' FROM dual
  6  )
  7  SELECT row_number() OVER(ORDER BY product_name)||'. '||product_name my_bullet_list
  8  FROM DATA;

MY_BULLET_LIST
-------------------------------------------------
1. Apples
2. Bananas
3. Oranges
4. Pears

如果您不关心行的顺序,可以简单地使用ROWNUM伪列。

我看不出有任何理由使用
listag
。Listag用于字符串聚合,您根本不需要聚合

您可以使用ROW_NUMBER()分析函数和串联运算符来获得所需的输出

比如说,

SQL> WITH DATA AS(
  2  SELECT 1001 PRODUCT_ID, 'Bananas' PRODUCT_NAME FROM dual UNION ALL
  3  SELECT 1002, 'Apples' FROM dual UNION ALL
  4  SELECT 1003, 'Pears' FROM dual UNION ALL
  5  SELECT 1004, 'Oranges' FROM dual
  6  )
  7  SELECT row_number() OVER(ORDER BY product_name)||'. '||product_name my_bullet_list
  8  FROM DATA;

MY_BULLET_LIST
-------------------------------------------------
1. Apples
2. Bananas
3. Oranges
4. Pears


如果您不关心行的顺序,您可以简单地使用ROWNUM伪列。

listag
chr(13)
作为分隔符对我来说毫无意义。奇怪,因为对我来说它的工作很好。(SQL开发人员4)。你使用哪个IDE?我不是说它不工作。我只是说LISTAGG在这里是不必要的。首先强制进行字符串聚合,然后使用chr(13)作为分隔符。这是矛盾的。您只需为每一行指定一个行号。另外,请记住,
listag
的SQL限制为4000个字符。我认为如果OP使用LISTAGG,这意味着他需要一个字符串值,而不是计算行(例如,可以在报告中使用)。实际上,了解Listag的限制很重要,但如果业务逻辑需要一个字符串值,则需要返回它。
listagg
使用
chr(13)
作为分隔符对我来说毫无意义。奇怪,因为对我来说它的工作很好。(SQL开发人员4)。你使用哪个IDE?我不是说它不工作。我只是说LISTAGG在这里是不必要的。首先强制进行字符串聚合,然后使用chr(13)作为分隔符。这是矛盾的。您只需为每一行指定一个行号。另外,请记住,
listag
的SQL限制为4000个字符。我认为如果OP使用LISTAGG,这意味着他需要一个字符串值,而不是计算行(例如,可以在报告中使用)。实际上,了解Listag的限制很重要,但是如果业务逻辑需要一个字符串值,则需要返回它。这里不需要
Listag
。您只需要将行号分配给每一行,并将其与其他列连接起来。另外,rememebr,
LISTAGG
的SQL限制为4000个字符/字节。我只需要生成一行。我将把它作为报告的数据。
chr(13)
是回车。是的,事实上是。这里不需要
listag
。您只需要将行号分配给每一行,并将其与其他列连接起来。另外,rememebr,
LISTAGG
的SQL限制为4000个字符/字节。我只需要生成一行。我将使用它作为报告的数据。
chr(13)
是回车。是的,事实上是。我只需要生成一行。我将使用它作为报告的数据。我只需要生成一行。我会把它作为报告的数据。只是吹毛求疵<代码>按NULL分区是无意义的使用@拉利特库马尔,我知道。然而,我总是用它来强调数据的“无分区”。只是吹毛求疵<代码>按NULL分区是无意义的使用@拉利特库马尔,我知道。然而,我总是用它来强调数据的“无分区”。