【问题标题】:how to replace a comma with single quote comma in SQLIN clause如何在 SQL IN 子句中用单引号逗号替换逗号
【发布时间】:2017-06-20 05:21:54
【问题描述】:

大家好,我有一个如下所示的 where 子句

select * from table1 
where colum1 IN (?parameter)

当我将值传递给参数时,它们显示如下 ('1,2,3') 但要执行查询,我需要将值更改为 ('1','2','3') 有没有办法直接用 IN 子句中的单引号逗号替换逗号?

【问题讨论】:

  • 没有简单的方法可以做到这一点;您正在考虑将输入字符串更改为另一个单个字符串,而不是几个单独字符串的列表(集合,数组,随便调用它)。您需要将输入字符串“拆分”为单独的标记。在这个网站上阅读“split csv”以了解它是如何完成的,这个问题已经被问过很多次了。
  • 我不太擅长Oracle,但不就是和这个一样吗? How to split comma separated string and pass to IN clause of select statement

标签: sql oracle where-clause in-clause


【解决方案1】:

使用like 可以做你想做的事:

select *
from table1 
where ',' || column1 || ',' like '%,' || (?parameter) || ',%';

这个功能,但它不会使用column1 上的索引。您应该考虑其他解决方案,例如:

  • 将字符串解析为表变量。
  • 使用带有固定数量参数的in
  • 将值存储在表中。

可能还有其他特定于 Oracle 的解决方案。

【讨论】:

  • “Hack”这个词可能太强了。当然,优化器不能用它做任何事情,但也许它不需要或者它不会导致任何重大的性能问题。这种方法的好处(我也打算建议)是它现在提供了功能,因此您可以继续提供其他东西。
【解决方案2】:

使用MS SQL,你可以将其转换为表值并根据你的条件使用join,我不熟悉oracle,但你可以找到相同的方法。

DECLARE @IDs varchar(max) ='1,2,3';
;WITH Cte AS 
( 
    SELECT
        CAST('<ID>' + REPLACE( @IDs,  ',' , '</ID><ID>') + '</ID>' AS XML) AS IDs 
)

SELECT '''' + Split.a.value('.', 'VARCHAR(100)') +'''' AS ID FROM Cte
    CROSS APPLY Cte.IDs.nodes('/ID') Split(a)

【讨论】:

    【解决方案3】:

    您可以使用 with 子句来实现它。这里的逻辑是将每个逗号分隔的值转换为不同的行。

    with temp_tab as ( 
      select replace(regexp_substr(parameter, '[^,]+',1, level),'''','') as str
      from dual
      connect by level<= length(regexp_replace(parameter, '[^,]+'))+1 )
    
    select * from table1 where column1 in (select str from temp_tab);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多