大家好,我有一个如下所示的where子句
select * from table1
where colum1 IN (?parameter)
当我将值传递给参数时,它们如下所示 ('1,2,3')
但是要执行查询,我需要将值更改为('1','2','3')
有没有办法直接在 IN 子句中用单引号逗号替换逗号?
有一个技巧可以做你想做的事,使用 like
:
select *
from table1
where ',' || column1 || ',' like '%,' || (?parameter) || ',%';
此功能,但它不会在 column1
上使用索引。 您应该考虑其他解决方案,例如:
- 将字符串解析为表变量。
- 使用具有固定参数数的
in
。 - 将值存储在表中。
可能还有其他特定于 Oracle 的解决方案。
使用 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)
您可以使用
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);