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