2011-08-04 10 views
5

ユーザーがIDで識別される異なるタイプを表す値を選択するクエリページを作成しています。 問題は、WHERE INメソッドを使用してデータベースからこれらのIDを選択することです。文字列をSQL WHERE INに渡す

これは、1つの値、例えばのために働く私のSQL文の

SELECT M.REG_NO, T.TYPE_ID 
    FROM MAIN AS M 
     INNER JOIN CLASSIFICATION AS C 
      ON M.REG_NO = C.REG_NO 
     INNER JOIN TYPE AS T 
      ON T.TYPE_ID = C.TYPE_ID 
    WHERE T.TYPE_ID IN (@Types) 

です。値が角括弧内にある場合はそうではありません。 (46)または(46 ')、それがINのためにあるべきである方法。

テーブルアダプターにアクセスして値を取得する方法を自動的に生成するVisual Studioを使用していますので、SQLを使用してこれを行う必要があります。

私は文字列を渡しています。 Types = "46,267,2010"をアダプタメソッドに渡します。このメソッドは、SQL文の@Typesに文字列を渡します。

助けがあれば助かります。ありがとう!

+0

知ってはいけませんSQL Serverを使用できますが、Oracleでは@Typesのようなバインドされた変数を渡すことはできません。別のvarまたはconstanを渡す必要があります各IN値に対してtを計算する。 –

答えて

10

これはかなり一般的な問題です。TSQLがまだそれを扱っていない理由はわかりません。とにかく、私が見つけた解決策は、私のためには、変数をテーブルに変換することですし、IN()を使うだけで問題ありません。

機能を皮切り:その後、

CREATE Function [dbo].[ParseStringList] (@StringArray nvarchar(max)) 
Returns @tbl_string Table (ParsedString nvarchar(max)) As 

BEGIN 

DECLARE @end Int, 
     @start Int 

SET @stringArray = @StringArray + ',' 
SET @start=1 
SET @end=1 

WHILE @end<Len(@StringArray) 
    BEGIN 
     SET @end = CharIndex(',', @StringArray, @end) 
     INSERT INTO @tbl_string 
      SELECT 
       Substring(@StringArray, @start, @[email protected]) 

     SET @[email protected]+1 
     SET @end = @end+1 
    END 

RETURN 
END 

と機能を使用するには...

SELECT * 
FROM table 
WHERE SomeFieldValue In (Select ParsedString From dbo.ParseStringList(@Types)) 
+0

ありがとう、私はこれを前にします。 – Anto

5

値のセットをコンマで区切る必要があるからです。 Like

WHERE 
T.TYPE_ID IN ('46', '45', '44'); 

SQL ServerまたはOracle、MySQLを使用していますか?

あなたは、このような

T.TYPE_ID IN ('46,45,44'); 

としてご複数の値で構成される文字列を持っている場合あなたは、あなたの文字列を区切り文字(分割または何でもそれはあなたのDBMSに応じて呼び出された)をusign爆発する機能が必要になる場合があります

+0

そのSQL Server。私は('46 '、'45'、'44 ')のような値を入力しようとしましたが、それは仕事をしませんでした。 – Anto

+0

データの種類は? '45'は、Type_IDがchar/varchar/nvarcharデータであることを前提としています。 Type_IDが整数の場合は、代わりに(46,45,44)を使用します。 – VoteCoffee

1

を以下Selectが私のために正常に動作:

SELECT M.REG_NO, T.TYPE_ID 
     FROM MAIN AS M 
      INNER JOIN CLASSIFICATION AS C 
       ON M.REG_NO = C.REG_NO 
      INNER JOIN TYPE AS T 
       ON T.TYPE_ID = C.TYPE_ID 
     WHERE (','[email protected]+',') LIKE '%,' +T.TYPE_ID+ ',%' 
関連する問題