使用in子句查询中的参数?

Hug*_*hem 11 sql delphi firebird

我想使用参数进行查询,如下所示:

SELECT * FROM MATABLE
WHERE MT_ID IN (368134, 181956)
Run Code Online (Sandbox Code Playgroud)

所以我想到这个

SELECT * FROM MATABLE
WHERE MT_ID IN (:MYPARAM)
Run Code Online (Sandbox Code Playgroud)

但它不起作用......

有没有办法做到这一点 ?

我实际上使用的是IBX和Firebird 2.1

我不知道IN子句中有多少参数.

小智 9

对谁还有兴趣.我使用另一个受此帖子启发的存储过程在Firebird 2.5中完成了它.

如何在存储过程中拆分逗号分隔的字符串?

CREATE OR ALTER PROCEDURE SPLIT_STRING (
    ainput varchar(8192))
RETURNS (
    result varchar(255))
AS
DECLARE variable lastpos integer;
DECLARE variable nextpos integer;
DECLARE variable tempstr varchar(8192);
BEGIN
  AINPUT = :AINPUT || ',';
  LASTPOS = 1;
  NEXTPOS = position(',', :AINPUT, LASTPOS);
  WHILE (:NEXTPOS > 1) do
  BEGIN
    TEMPSTR = substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS);

    RESULT = :TEMPSTR;
    LASTPOS = :NEXTPOS + 1;
    NEXTPOS = position(',', :AINPUT, LASTPOS);
    suspend;
  END

END
Run Code Online (Sandbox Code Playgroud)

当您传递SP以下列表时

CommaSeperatedList = 1,2,3,4

并打电话

SELECT * FROM SPLIT_STRING(:CommaSeperatedList)
Run Code Online (Sandbox Code Playgroud)

结果将是:

RESULT
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

并可以使用如下:

SELECT * FROM MyTable where MyKeyField in ( SELECT * FROM SPLIT_STRING(:CommaSeperatedList) )
Run Code Online (Sandbox Code Playgroud)


Ond*_*lle 5

我最终在Firebird中使用了一个全局临时表,首先插入参数值并检索我使用常规JOIN而不是WHERE ... IN子句的结果.临时表是特定于事务的,并在commit(ON COMMIT DELETE ROWS)上清除.