2010-03-19 207 views
0

我有了以下的柱吨-SQL字符串连接

Type 
-------- 
type 1 
type 2 
type 3 

如何可以转换上述为字符串等(“类型1”,“2型”,“类型3”)

一个表

我想在IN子句中使用我的t-sql查询中的输出。像从表A中选择*,其中SomeColumn IN( '1型', '2型',类型3' )

我用以下拿出输出(1型,2型,3型)

select '(' + STUFF((select ', ' + Type from TableA for xml path ('')),1,2,'') + ')' 

但是不知道如何插入单引号。

+0

选择“”“空”“” – garik 2010-03-19 22:30:47

+0

@CResults:*“请看我的回答如下” *那是什么意见的地步?他已经收到了你已经回答的通知,你的代表明确知道某人。所以...?! – 2010-03-19 22:46:48

+0

@TJ评论删除:-) – CResults 2010-03-19 23:05:32

回答

1

通常的方法是使用子查询:

select * from TableA where SomeColumn IN (
    select Type from TheOtherTable 
) 

我猜你必须在子选择一个where条款也是如此。

根据复杂性,有时你这样做与外部连接,而不是:

select * from TableA a 
left outer join TheOtherTable b on a.SomeColumn = b.Type 
where b.Type is not null 

使用哪种取决于你从TableA适用于这两种记录的标准,我已经叫TheOtherTable(中一个与Type)。

+0

我已经尝试过,它似乎并不正在工作。但同样的方法在处理整数数据类型时工作 – stackoverflowuser 2010-03-19 22:30:53

+0

@stackoverflowuser:我用'varchar'列大量次使用了这个;这不是列类型的问题。你希望确保'null'不会作为子选择符的结果出现,是你的子选项'where'来确保?你提供的信息越多,真的越好。 – 2010-03-19 22:33:54

+0

你是对的。我尝试了一个示例表,这似乎工作。但它不适用于我的桌子。所以这里是整个事情 - 我有一个用户定义函数,返回一个表(ID int,TypeName varchar(8000)) 我这样做select * from TableA其中Type in(从dbo.udf_MyFunction中选择TypeName(someinput) ) 但上述不起作用。 – stackoverflowuser 2010-03-19 22:49:02

0

无论您何时需要报价,double类型它

所以'变为 ''

使你的代码变得

select '(' + STUFF((select ''',''' + Type from TableA for xml path ('')),1,2,'') + ''')' 

上面产生

('type 1','type 2','type 3') 
+1

??为什么-1? – CResults 2010-03-19 22:44:41

1

试试吧为了好玩:)

declare @s1 varchar(8000) 
declare @s2 varchar(8000) 

update t 
    set 
    @s1 = ISNULL(@s1 + ',', '') + '''' + REPLACE(t.Type, '''', '''''') + '''' 
    ,@s2 = 'select * from TableA where Type IN (' + @s1 + ')' 
from TableA t 

select @s2 

REPLACE(t.Type, '''', '''''') - 如果字段在字段的文本中有任何撇号,REPLACE会将其加倍。尝试改变TYPE1typ'e1typ''e1在表表A

我停在开玩笑......

尽量避免在子句和子查询。他们工作非常缓慢(表扫描等...)! 使用此:

select a.Type 
from TableA a 
    inner join TheOtherTable b 
    on a.Type = b.Type