2013-06-18 2 views
0

Я использую MS SQL 2008 и у меня есть поле статуса, который приходит, как это:Как отфильтровать SQL-запрос в точном соответствии с строкой?

"REF CNF PCNF REL" 

Мне нужно, чтобы получить все заказы со статусом CNF без возврата PCNF. Я мог бы сделать это, используя пробелы до и после WHERE STATUS LIKE '% CNF %', но если CNF - это первый или последний статус, он будет работать.

Одно решение, которое работало было:

WHERE 
    PATINDEX('CNF %',STATUS)=0 AND 
    PATINDEX('% CNF %',STATUS)=0 AND 
    PATINDEX('% CNF',STATUS)=0 

Но это просто ужасно. Спасибо,

+2

Вы должны нормализовать поле статуса в свою собственную таблицу, тогда эта проблема в основном уходит. Вы никогда не должны хранить отформатированные данные и/или несколько частей данных в одном поле, если вам необходимо регулярно обрабатывать «под-данные» этого поля. –

ответ

2

Как сказал Marc B., вы должны нормализовать таблицу, чтобы не хранить более одного значения в одном поле.

Если у вас нет полномочий, чтобы сделать это, или если вы хотите сохранить свою модель, как это, вы можете попробовать добавить пробелы до и после строки:

WHERE ' '+STATUS+' ' LIKE '% CNF %' 

Таким образом, вы не нужно беспокоиться о том, что CNF является первым или последним пунктом в вашем списке.

Я не знаю, является ли это самым элегантным/эффективным решением, но оно работает.

+0

Не будет ли это связано с выполнением конкатенации по каждой строке в результирующем наборе перед оценкой предложения 'where'? Это может стать дорогостоящим на большом столе. –

+0

Конечно, но не более 3 вызовов 'PATINDEX', например. Поиск шаблонов в строках ('LIKE') уже очень дорог. Для эффективности нормализация + индексация является ключом. –

0

Почему не просто

WHERE STATUS LIKE '% CNF%' OR STATUS LIKE 'CNF%' 

?

Подстановочный знак % соответствует любым символам (-ам), также нет.

+0

Что делать, если «CNF» приходит на первое место? Это заканчивается почти так же долго, как решение OP. А что, если есть, скажем, «CNFF»? –

+0

Первое место? Разве это не «... ИЛИ СОСТОЯНИЕ КАК« CNF% »? – Mackie

+1

Да, я согласен, но «CNFF» все еще выходит (я предполагаю, что этот csae может произойти в будущем, если не сейчас, поскольку OP использует пробелы в качестве разделителей до и после того, какую ценность он или она ищет). Кроме того, это не намного короче OP'solution. –

0

Использование SQL 2008's own internal functions, лучшее, что я могу вспомнить, получить его вниз только два условия, такие как:

where STATUS like 'CNF%' or STATUS like '%[^P]CNF%' 

Но если бы вы были готовы install a .Net add-on, вы можете использовать регулярные выражения, как так:

where 1 = dbo.RegExpLike(STATUS, '(CNF| CNF)') 
Смежные вопросы