2010-11-27 48 views
2

varcharデータ型としてカンマで区切られたcat IDを含むことができる列を持つテーブルカテゴリ(c)と別のテーブル(x)があります。関連カテゴリを選択したいが、 "varchar値 '5'をデータ型intに変換すると変換に失敗しました。"選択しようとすると:私は右のそれを取得する場合は、「1,3,4」varchar値 '1'をデータ型intに変換するときに変換が失敗しました

+1

WHERE ID INをWHERE CAST(IDはvarchar(5))のINに置き換えるとどうなりますか? – CarneyCode

+0

私は@Trarothに同意します。コンマで区切られた値の文字列として返されるIDのリストは、**データベース設計の問題**を示唆しています。本当に 'x'テーブルに' catIDs'カラムがありますか?これは単なる例であり、実際には格納されたrpocedureから返されるか、フラットファイルから取り出されますか? –

+0

@Carnotaurus:それは働いていますが、 'x、y'ではなく 'x'、 'y'を探しているので正しい結果を返さない –

答えて

4

サブクエリによって返された1,3,4文字列を別のint値に分割する必要があります。 SQL Serverには組み込み関数がありませんが、this user-defined functionを使用できます。

次のようにデータベース、その後、再書き込みクエリで機能dbo.Splitを作成します。

SELECT ID, Title 
FROM c 
WHERE ID IN 
    (
    SELECT s 
    FROM dbo.Split(',', '1,3,4') 
) 

私は一例でサブクエリを置き換えクエリを短くし、それが簡単に理解できるようにすること1,3,4を結果。

+0

はい、http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-recor/314917#314917を使用します。関数。ありがとうございました。 –

1

よう

SELECT ID, Title FROM c WHERE ID IN (SELECT catIDs FROM x WHERE ID=any); 

サブクエリが返すデータを、あなたが実際にあなたのコラムcatIDsで「1,3,4」のような値を持っています。したがって、サブクエリを選択して部分文字列を抽出する必要があります。

ところで、私はMS SQL Serverのエキスパートではありませんが、おそらくそれを行うには悪いデータベース設計です。このような場合にRDBMSエンジンがインデックスを使用するかわかりません...

関連する問題