2010-03-19 11 views
0

я есть таблица, которая имеет следующий столбецT-SQL конкатенации

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

Как можно преобразовать выше в строку, как («тип 1», «2-го типа», «тип 3»)

Я хочу использовать вывод в моем запросе t-sql с предложением IN. Что-то вроде select * from TableA где SomeColumn IN ('Тип 1', 'Тип 2', тип 3')

я использовал следующие придумать выход (тип 1, тип 2, тип 3)

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

Но не знаю, как вставлять одинарные кавычки.

+0

выберите «» «пустой» «» – garik

+0

@CResults: * «смотрите, пожалуйста, мой ответ ниже» * Какой смысл этого комментария? Он уже получит уведомление, на которое вы ответили, что кто-то с вашим представителем ясно знает. Так...?! –

+0

@TJ комментарий удален :-) – CResults

ответ

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

+0

@stackoverflowuser: я использовал это с столбцами 'varchar' много раз; это не проблема типа столбца. Вы хотите быть уверенным, что 'null' не появляется в результате подзапроса, является ли ваш' where' в подзапросе, обеспечивающим это? Чем больше информации вы предоставляете, тем лучше. –

+0

Вы правы. я пробовал на образцовой таблице и, похоже, работает. Но это не работает с моей таблицей. Итак, вот и вся вещь: у меня есть пользовательская функция, которая возвращает таблицу (ID int, TypeName varchar (8000)) Я делаю это select * from TableA, где Type in (выберите TypeName из dbo.udf_MyFunction (someinput)) Но вышеуказанное не работает. – stackoverflowuser

0

Всякий раз, когда вам нужна цитата, двойной тип он

так 'становится ''

поэтому код становится

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

выше генерирует

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

?? почему -1 ?? – CResults

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 удвоит его. Попробуйте изменить type1 к typ'e1 или typ''e1 в таблице TableA

я перестал шутить ...

Try, чтобы избежать в п и подзапросов. Они работают очень медленно (сканирование таблицы и т. Д.)! Используйте это:

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