2012-05-07 9 views
0

このような番号のリストを使用しようとしています。SQLの開発者でvarcharを数値に変換する方法

SELECT * 
FROM users 
WHERE id in (list_of_ids) 

これは、SQLプロシージャと変数「list_of_ids」の部分がvarchar型であり、それは、このようなIDが含まれています1,2,3,4,5 ........ がどのように使用することができますこのリストとこのクエリ

答えて

5

これも試してみてください。これは、作成するために追加の機能を必要としないため、より良い解決策になる可能性があります。 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) 
+2

これは非常にクールなトリックです! –

0

あなたはこのPL/SQLブロックのように、SQLクエリを構築するために、REFカーソルを使用することができます。

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; 
/
-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,',')) 
+1

-1、これはOracle PL/SQLではありません。 – Ben

+0

SQL Serverのテーブル値関数のように見えます。ここでは、oracleに相当する例を示します。しかし、@ NoRulesの答えはよりエレガントに見えます。 Microsoft側でregexp_substrを使用して欲しいと願っています。 http://decipherinfosys.wordpress.com/2008/10/27/returning-a-record-set-from-a-function-in-oracle-sql-server-and-db2/ –

関連する問題