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')

为什么查询 2 尝试 1 或 2 不起作用?

4

3 回答 3

1

你不想要一个in子句。你想使用like

select *
from myTableTwo t2
where exists (select 1
              from myTable t
              where id = 23 and
                    ', '+t.col1+', ' like '%, '+t2.myfield+', %' 
             );

like用于列表中的比较。它对值使用子查询。您也可以join通过以下方式将其表述为:

select t2.*
from myTableTwo t2 join
     myTable t
     on t.id = 23 and
        ', '+t.col1+', ' like '%, '+t2.myfield+', %';

id = 23但是,如果in有不止一行,这可能会增加输出中的行数myTable

于 2013-07-08T17:42:47.253 回答
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'. 如果这是您的情况,它不是世界上最好的(非规范化数据库),但您仍然可以使用诸如LIKEor之类的字符运算符来关联这些表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 回答