0

私のデータでは、列の値が次のようになるレコードが返されるという問題があります

-- クエリ

Select col1 from myTable where id = 23

-- col1 111、104、34、45 の結果

これらの値を in 句にフィードしたいと考えています。これまでのところ、私は試しました:

-- クエリ 2 -- 1 を試す

Select * from mytableTwo
where myfield in (
SELECT col1
from myTable where id = 23)

-- クエリ 2 -- 2 を試す

Select * from mytableTwo
where myfield in (
SELECT '''' +  
Replace(col1, ',', ''',''') + ''''
from myTable where id = 23)

-- クエリ 2 テスト -- これは機能し、データが返されるので、ここでデータが存在することを確認します

Select * from mytableTwo
where myfield in ('111', '104', '34', '45')

query 2 try 1 または 2 が機能しないのはなぜですか?

4

3 に答える 3

0

よく見ると、Query 2 -- try 1 & Query 2 -- try 2 は単一の値と見なされます。

このような :

WHERE myfield in ('111, 104, 34, 45')

と同じではありません:

WHERE myfield in ('111', '104', '34', '45')

そのため、MyTableTwo から myTable 行をフィルター処理する場合は、フィールド列データの値をテーブル変数/テーブル値関数に抽出し、データをフィルター処理する必要があります。

コンマ区切りの文字列を取り、テーブル値を返すテーブル値関数を作成しました。ここで参照できますT-SQL : テーブルへのカンマ区切り値

データをフィルタリングする最終的なコード:

DECLARE @filteredIds VARCHAR(100)

-- Get the filter data
SELECT @filteredIds = col1
FROM myTable WHERE id = 23

-- TODO : Get the script for [dbo].[GetDelimitedStringToTable] 
-- from the given link and execute before this
SELECT * 
FROM mytableTwo T
CROSS APPLY [dbo].[GetDelimitedStringToTable] ( @filteredIds, ',') F
WHERE T.myfield = F.Value

これが役に立ったら教えてください!

于 2013-07-08T17:49:56.127 に答える
0

は文字型だと思いますcolが、その結果は のようになり'111, 104, 34, 45'ます。これがあなたの状況である場合、それは世界最高 (非正規化データベース) ではありませんが、LIKEまたはのような文字演算子を使用してこれらのテーブルを関連付けることができますCHARINDEX。唯一の問題は、数値列を文字に変換することです。文字と数値の間のデフォルトの変換は数値であり、変換エラーが発生します。

@Gordon が を使用して応答したのでLIKE、次を使用して解決策を提示しCHARINDEXます。

SELECT *
FROM mytableTwo tb2
WHERE EXISTS (
    SELECT 'x'
    FROM myTable tb1
    WHERE tb1.id = 23
    AND CHARINDEX(CONVERT(VARCHAR(20), tb2.myfield), tb1.col1) > 0
)
于 2013-07-08T17:51:43.557 に答える