0

我试图使用这样的数字列表。

SELECT *
FROM users
WHERE id in (list_of_ids)

这是 sql 过程的一部分,变量“list_of_ids”是 varchar,它包含如下 id:1,2,3,4,5........我如何使用这个列表和这个查询

4

3 回答 3

6

试试这个。这可能是更好的解决方案,因为它不需要创建任何额外的功能。oracle regexp_substr 会将逗号分隔的值拆分为不同的行并传递给查询。

SELECT *
FROM users
WHERE id in 
(SELECT regexp_substr(list_of_ids,'[^,]+', 1, level) FROM dual
connect by regexp_substr(list_of_ids, '[^,]+', 1, level) is not NULL)
于 2012-05-07T09:46:28.770 回答
0

您可以使用 ref 游标来构造 sql 查询,就像在这个 pl/sql 块中一样:

declare
  list_of_ids    varchar2(100) := '1,3,4'; -- example
  c_cursor       sys_refcursor;
  result         number;
begin
  open c_cursor for ( 'SELECT id '||
                      'FROM   users '||
                      'WHERE  id in ('||list_of_ids||')'
                    );
  fetch c_cursor into result;
  while c_cursor%found
  loop
    dbms_output.put_line('ID='||to_char(result)); 
    fetch c_cursor into result;
  end loop;
  close c_cursor;
end;
/
于 2012-05-07T09:48:29.610 回答
-3

在您的项目中尝试此解决方案。
添加一个返回表的新用户函数。
代码如下:

CREATE   FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter
 varchar(20) = ' ')
RETURNS @Strings TABLE
(    
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)   
)
AS
BEGIN
DECLARE @index int 
SET @index = -1 
WHILE (LEN(@text) > 0) 
 BEGIN  
    SET @index = CHARINDEX(@delimiter , @text)  
    IF (@index = 0) AND (LEN(@text) > 0)  
      BEGIN   
        INSERT INTO @Strings VALUES (@text)
          BREAK  
      END  
    IF (@index > 1)  
      BEGIN   
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))   
        SET @text = RIGHT(@text, (LEN(@text) - @index))  
      END  
    ELSE 
      SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END
  RETURN
END

然后从您的存储过程中调用它,如下所示。

DECLARE @list_of_ids AS VARCHAR(100)

SET @list_of_ids = '1,2,3,4,5,6,7,8,9,10,'


SELECT *
FROM users
WHERE id in (SELECT value FROM dbo.fn_Split(@list_of_ids,','))
于 2012-05-07T10:08:23.483 回答