Сопоставление с образцом в текстовом столбце - PullRequest
2 голосов
/ 03 августа 2011

У меня есть текстовый столбец, и данные в текстовых столбцах приведены ниже:

Rob goes to school,get punished
Rob goes to school
Rob does not goes to school,get punished

При попытке написать запрос с помощью оператора case, например

CASE 
    WHEN (PATINDEX('%Rob goes to school%',value) > 0) OR
         (PATINDEX('%Rob is ill%',value) > 0 ) AND
         (PATINDEX(%get punished%',value) > 0) THEN
           'DONE'

.только 1-й оператор, но вместо этого он выбирает 1-й и 2-й оператор с помощью DONE.Любое предложение, как сделать сопоставление с образцом в этом случае?Я использую SQL Sever 2005/2008

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Оператор предшествует e и недостаточно круглых скобок, вероятно

У вас есть x OR y AND z, что на самом деле x OR (y AND z). Хочешь хочешь (x OR y) AND z?

  • 2-е утверждение дает true OR (false AND false), что дает true
  • Вы хотите (true OR false) AND false, чтобы дать false

Так что SQL должен быть

CASE WHEN
   (
      PATINDEX('%Rob goes to school%', value) > 0
      OR
      PATINDEX('%Rob is ill%', value) > 0
   )
   AND
   (PATINDEX(%get punished%', value) > 0) THEN 'DONE'
...
0 голосов
/ 03 августа 2011

PATINDEX не обрабатывает ваши строки как списки с разделителями (значения, разделенные запятыми) - он ищет совпадения со всей строкой.

Роб идет в школу, получает наказаниеРоб идет в школу

PATINDEX ('% Роб идет в школу%', значение)> 0 оценивается как истинное для них обоих, потому что подстановочный знак соответствует любой строке из 0 или более символов ,Ваш второй и третий шаблоны никогда не будут оценены.

If you want to test which pattern is returning true, try this:
CASE 
    WHEN (PATINDEX('%Rob goes to school%',value) > 0) THEN 'Pattern 1'
    WHEN (PATINDEX('%Rob is ill%',value) > 0 ) THEN 'Pattern 2'
    WHEN (PATINDEX('%get punished%',value) > 0) THEN 'Pattern 3'
    ELSE 'No Match Found' END

Если вы хотите, чтобы шаблон соответствовал первому значению, но не второму, тогда ищите (PATINDEX('%Rob goes to school,%',value) > 0) с запятой.

В противном случае - если вы хотите обрабатывать строки как значения, разделенные запятыми, PATINDEX - не лучший инструмент для этого.Другие варианты могут включать преобразование ваших строк в таблицы с помощью функции табличных значений, или что у вас есть.

...