【问题标题】:Get Comma Separated Ids in variable plsql [duplicate]在变量plsql中获取逗号分隔的ID [重复]
【发布时间】:2018-10-16 07:23:15
【问题描述】:

我有一张这样的桌子

id  |  Name
===========
1   |  A
2   |  A
3   |  A
4   |  B
5   |  B
6   |  C

我正在编写 select id from tbl where name = "A",我想在单个变量中使用逗号分隔的所有三个 id (1,2,3),然后我想在另一个变量中使用该变量选择具有 IN 子句的查询,有什么帮助吗?

【问题讨论】:

  • 您尝试过查询吗?掌握 SQL(或任何语言)的最佳方法是练习使用它。
  • 当前我正在逐一获取 id 值并使用 for 循环,但现在我想获取所有 id 用逗号分隔,然后想使用一个带有 IN 子句的 select 语句,没有任何想法如何做到这一点..:(
  • 阅读以上链接。
  • 用逗号分隔值的字符串变量是否在 IN 中工作?也许先验证一下!
  • " 我想在单个变量中获取所有三个 id (1,2,3),用逗号分隔,然后我想在另一个具有 IN 子句的选择查询中使用该变量" 为什么?为什么你想要一个 IN 子句,它只是 in ( select id from tbl where name = 'A')

标签: sql oracle string-aggregation


【解决方案1】:

正如其他人指出的那样,使用 listagg() 应该可以解决问题:

SELECT listagg(id, ',') WITHIN GROUP (ORDER BY id) as concatenation 
FROM mytable 
WHERE name = 'A'

【讨论】:

    【解决方案2】:

    这是有效的:

    create table ns_1111(col1 number,col2 varchar(20));
    
    insert into ns_1111 values(1,'A');
    insert into ns_1111 values(2,'A');
    insert into ns_1111 values(3,'A');
    insert into ns_1111 values(4,'B');
    insert into ns_1111 values(5,'B');
    insert into ns_1111 values(6,'C');
    SELECT * FROM ns_1111;
    
    
    select * from (SELECT LISTAGG(col1, ', ') WITHIN GROUP (ORDER BY col1)
    FROM ns_1111 group by col2) where rownum<=1   ;
    

    输出:

    1, 2, 3
    

    【讨论】:

    • SQL 查询的排序是不确定的(除非指定了ORDER BY 子句)。随机播放您的 INSERT 语句(或在您的表上启用行移动),或尝试获取 B 的结果,并且您的查询不会给出预期结果,因为您依赖于非确定性顺序给您确定性结果。
    • 我将在 col1 中使用 order by
    • @MT0 我对插入内容进行了改组,然后其显示的正确结果也会导致您不小心降低了我的答案
    • SQLFiddle 给出了一个没有给出预期结果的例子。如果你在内部查询中使用ORDER BY col1,那么你会得到ORA-00979: not a GROUP BY expression
    • 我的 sql developer 给出了正确答案 fiddle 和 sql developer 之间有什么区别
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 2018-01-14
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多