【问题标题】:Oracle SQL comma separated parameter in where clause [duplicate]where子句中的Oracle SQL逗号分隔参数[重复]
【发布时间】:2020-01-10 22:45:33
【问题描述】:

我的桌子是这样的:

+----------+----------+
|stud_id   |stud_name |
+----------+----------+
|101       |A         |
|102       |B         |
|103       |C         |
|104       |D         |
|105       |E         |
+----------+----------+

我的查询

SELECT * FROM students_tbl stud WHERE stud.stud_id IN (:s_id);

当我输入 102 时,它返回:

+----------+----------+
|stud_id   |stud_name |
+----------+----------+
|102       |B         |
+----------+----------+

正如预期的那样。

有没有一种方法可以输入多个值,例如 102,103,104 和这样的结果?:

+----------+----------+
|stud_id   |stud_name |
+----------+----------+
|102       |B         |
|103       |C         |
|104       |D         |
+----------+----------+

【问题讨论】:

标签: sql oracle


【解决方案1】:

下面的查询会要求你输入 3 个输入值,你会得到想要的结果

SELECT * FROM students_tbl stud WHERE stud.stud_id IN (:s_id,:s_id1,:s_id2);

【讨论】:

    【解决方案2】:

    不需要拆分绑定变量的值;更快的解决方案是查看 id(加上周围的分隔符)是否是绑定变量的子字符串(带有前导和尾随分隔符):

    select *
    from   students_tbl
    where  ','||:s_id||',' LIKE ','||stud_id||','
    

    【讨论】:

    • 我只想指出,这种结构会阻止您在 stud_id 上使用索引。如果桌子有几百名学生,可能并不重要。但是,如果桌子上有几十万学生,那将变得很昂贵。
    • 如果你真的想要,你可以将:s_id 作为TABLE OF NUMBER 传递并使用WHERE stud_id MEMBER OF :s_id
    【解决方案3】:

    您可以使用regexp_substrconnect by

    SELECT * FROM students_tbl stud WHERE stud.stud_id IN 
    (Select regexp_substr(:s_id,'[^,]+', 1,level)
    From dual
    Connect by regexp_substr(:s_id,'[^,]+', 1, level) is not null);
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-27
      • 2012-09-22
      • 2019-08-23
      • 2020-07-27
      • 2017-07-04
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多