2013-08-23 2 views
3

@ConfListTable - это параметр таблицы значений (TVP), который имеет список кодов подтверждения. Я хочу выбрать все записи из таблицы PmtHist, где код подтверждения также находится в @ConfListTable. Следующий код хорошо работает для этого; Нет проблем.Как выбрать, где в (Другая таблица), но с модификацией

Select * from PmtHist 
Where Confirmation in(
    Select Str1 as ConfirmationCode 
    From @ConfListTable 
    ) 

Моя проблема заключается в следующем: Код подтверждения в PmtHist иногда имеет «аннулирована» после собственно кода подтверждения. Как «ab321voided» Но я действительно хочу эти записи. Как изменить приведенный выше запрос, чтобы получить записи, которые соответствуют записи в @ConfListTable или соответствуют @ConfListTable + 'voided'?

ответ

3

Быстрый & простой способ это просто использовать REPLACE:

Select * 
from PmtHist 
Where REPLACE(Confirmation, 'voided', '') in(
    Select Str1 as ConfirmationCode 
    From @ConfListTable 
) 
+0

Я тестировал скорость различных запросов; Использование Replace на самом деле было самым быстрым. PmtHist имеет только несколько тысяч записей. –

1
select * 
from PmtHist ph 
where exists (
    select 1 from @ConfListTable 
    where ph.Confirmation in (Str1, Str1 + 'voided') 
) 
+0

Я проверил это 26 раз и проверил, сколько миллисекунд (мс): 4 х 46 мс; 6 x 60 мс; 16 х 63 мс. Это был самый медленный метод для моей ситуации. –

+1

@D_Bester, мне нравится тот, у кого есть «замена», хотя это не «точное» решение, и может также ловить строки, где «voided» не обязательно в конце, например. 'Abvoided321. Если вы знаете, что у вас нет таких данных, то, безусловно, более быстрой альтернативой является выбор. –

0

Добавить "где не":

Select * from PmtHist 
Where Confirmation in(
    Select Str1 as ConfirmationCode 
    From @ConfListTable 
    ) 
and Confirmation not in(
    <some list of voided confirmation 
    ) 
1

Для лучшей производительности, я предлагаю использовать два отдельных запроса

SELECT * 
FROM dbo.PmtHist t1 
WHERE t1.Confirmation IN (SELECT t2.Str1 FROM @ConfListTable t2) 
UNION ALL 
SELECT * 
FROM dbo.PmtHist t1 
WHERE t1.Confirmation IN (SELECT t2.Str1 + 'voided' FROM @ConfListTable t2) 

См. Демо на SQLFiddle

+0

Я не уверен, как это масштабируется для больших приложений, но этот метод был медленнее, чем использование Replace для меня. Замена варьируется от 13 до 16 миллисекунд. Союз все занял больше времени. (из 25 тестов: 17 х 30-33 мс, 8 х 16 мс) –

Смежные вопросы