0

セミコロンで区切られた複数の項目を持つパラメーターがあります。これらの項目を IN 句で使用する必要があります。例えば:

parItems = 'アイテム1;;アイテム2;;アイテム3'

次に、次のように sql に追加する必要があります。

SELECT somestuff, morestuff FROM sometable WHERE item in (parItems)

これを行う簡単な方法はありますか?

ごめんなさい。前に述べたように、Oracle ODBC ではなく MSSQL DB を参照する Reporting Services になります。

4

5 に答える 5

0
Use AsG
Go
Drop FUNCTION AsG_inListesiOlustur
Go
CREATE FUNCTION AsG_inListesiOlustur (@pDegerListesi nvarchar(MAX), @pBossaVarsayilanDeger varchar(50))
   RETURNS @pNeticeTablo TABLE (Deger varchar(50) NOT NULL) AS
BEGIN
   DECLARE @Pozisyon        int,
           @sonrakiPozisyon    int,
           @uzunluk   int

   SELECT @Pozisyon = 0, @sonrakiPozisyon = 1
   Select @pDegerListesi = LTRIM(RTRIM(@pDegerListesi))
   If LEN(@pDegerListesi) = 0
     Begin
     If LEN(@pBossaVarsayilanDeger) > 0 
       Begin
       INSERT @pNeticeTablo (Deger) VALUES (@pBossaVarsayilanDeger)
       End
     End Else
     Begin   
     WHILE @sonrakiPozisyon > 0
       BEGIN
       SELECT @sonrakiPozisyon = CharIndex(',', @pDegerListesi, @Pozisyon + 1)
       SELECT @uzunluk = CASE WHEN @sonrakiPozisyon > 0
                              THEN @sonrakiPozisyon
                              ELSE Len(@pDegerListesi) + 1
                         END - @Pozisyon - 1
       INSERT @pNeticeTablo (Deger)
          VALUES (Convert(varchar, SubString(@pDegerListesi, @Pozisyon + 1, @uzunluk)))
       SELECT @Pozisyon = @sonrakiPozisyon
       End
     End
   RETURN
END
Go

Select * From  [AsG].[dbo].[AsG_inListesiOlustur]('1,4', '0')
Go

Select * From  [AsG].[dbo].[AsG_inListesiOlustur]('', '')
Go
于 2013-01-14T14:09:18.873 に答える
0

これはさらに別のバリエーションです。ジャスティンの答えに似ていますが、SQL Serverの場合:

以下の関数は、結合できるテーブルを返します。

CREATE FUNCTION listToTable (@list nvarchar(MAX))
   RETURNS @tbl TABLE (item varchar(50) NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(';', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (item)
         VALUES (convert(varchar, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END

SELECT somestuff, morestuff 
FROM sometable a
join listToTable('item1;item2;item3') b
on a.columnA = b.item
于 2012-08-07T18:49:29.127 に答える
0

リストが比較的短い (つまり 4000 文字未満) 場合の別の方法は、INSTR 関数を使用することです。

SELECT somestuff, morestuff FROM sometable
WHERE INSTR( ';;' || parItems || ';;'
           , ';;' || item || ';;'
           ) > 0;

ただし、このアプローチの主な欠点は、述語が選択的でないことです。ただし、データ量によっては、必ずしも問題になるわけではありません。

于 2012-08-08T01:56:08.077 に答える