2

コンマで区切られた値を保持する文字列があります= value1、value2、value3 .......

次の操作を実行したい:

SELECT col FROM table WHERE col IN :values

値が 1000 エントリ未満の場合、これは正常に機能します。値に 1000 を超えるエントリがある場合、エラーが発生します。INの使用には制限があります。

このクエリを実行する別の方法はありますか?

編集: Oracle のビジネス インテリジェンス パブリッシャー アプリケーションです。顧客/ユーザーは、その下にある任意のデータベースを使用できます。

データベースを制御できません。そのため、一時テーブルまたはストアド プロシージャを作成できません。私ができることは、UI 画面から複数の値を選択し (コンマ区切りの文字列を形成します)、それを SQL クエリで使用することだけです。生成されるレポートによって異なります。

  • 静的文字列値で EXISTS を使用することはできません。
  • ストアド プロシージャまたは一時テーブルは使用できません。
4

5 に答える 5

2

最高のパフォーマンスを得るには、少し工夫が必要です。値をそれぞれ 1 行に保持するメモリ内一時テーブルを作成し、実際のテーブルをこの一時テーブルに結合することをお勧めします。これにより、クエリが大幅に高速化され、追加のボーナスとして、一時テーブルの行数は制限されません (または、メモリによってのみ制限されます)。

于 2012-10-25T12:39:45.420 に答える
2

グローバル一時テーブルを作成できない場合は、区切りリストを使用して行に変換し、sys.dbms_debug_vc2coll()このコレクションに結合できます。

SELECT t.col 
FROM table t
JOIN TABLE(SELECT column_value 
             FROM sys.dbms_debug_vc2coll(:values)) c on t.col = c.column_value;
于 2012-10-25T20:27:35.320 に答える
0

ストアド プロシージャに渡された CSV 文字列を分割するために、次の関数を何年も使用してきました。(それが最も現代的、エレガント、または効率的な方法ではない場合は申し訳ありませんが、私たちの目的にはうまくいきました)

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(    
  position int IDENTITY,
  value varchar(8000)   
)
AS
BEGIN
DECLARE @index int 
SET @index = -1 
SET @text = LTRIM(RTRIM(@text))
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

使用中は次のとおりです。

select value from dbo.fn_Split('string1,string2,string3',',')

(ああ、これはMS SQL Serverデータベース用です)

于 2012-10-25T12:43:49.157 に答える
0

値を一時テーブルに挿入してから、結合を実行できます。

SELECT col from table t1 JOIN #temp t2 WHERE table.col = t2.col;
于 2012-10-25T12:40:42.530 に答える
0

次のように、このジョブを実行するストアド プロシージャを作成します。

Create PROCEDURE [dbo].[spGetData] 
    -- Add the parameters for the stored procedure here
    @ids nvarchar(MAX)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

CREATE TABLE #TempTable(col int)
while len(@ids) > 0
begin
  insert into #TempTable values (left(@ids, charindex(',', @ids+',')-1))
  set @ids = stuff(@ids, 1, charindex(',', @ids+','), '')
end
    -- Insert statements for procedure here
    select col from table where col in (select col from #TempTable)
END 

ソースは私のブログからです: http://alisissa.wordpress.com/2012/10/24/pass-a-comma-separated-list-to-a-stored-procedure/

于 2012-10-25T12:42:02.370 に答える