Как выбрать строки в Teradata SQL на основе сложных условий в Teradata SQL?

#sql #teradata #teradata-sql-assistant #teradatasql

Вопрос:

У меня есть таблица в Teradata SQL, как показано ниже:

 col1        col2 
Jan Kowal  | Jan Kowal PHU
Bravo JohN | GB John BraVo
Ann Still  | Ronald G
 

И мне нужно выбрать только эти строки из приведенной выше таблицы, где:

  1. В col2 есть значение от col1 что-то большее (неважно, до или после)
  2. Имейте в виду, что Ян Коваль и Коваль Ян-это имя и фамилия, и они могут быть коммутативными
  3. Регистр = Ложь (неважно, большая буква или маленькая)

Поэтому мне нужно выбрать только первую и вторую строки:

 col1          col2
Jan Kowal  | Jan Kowal PHU
Bravo JoHN  | GB John BraVo  
 
  • Потому что обе строки имеют значение из col1 что-то большее (до или после) в col2
  • Регистр букв = Ложь
  • имя и фамилия, и это может быть коммутативным

Комментарии:

1. Всегда ли значение в col1 равно 2 словам?

Ответ №1:

Вы описываете первый столбец как имеющий «имя» и «фамилию», что означает, что он состоит ровно из двух компонентов.

Для решения этой проблемы strtok() может помочь:

 where regexp_instr(col2, strtok(col1, ' ', 1), 'i') and
      regexp_instr(col2, strtok(col1, ' ', 2), 'i')
 

Я использовал здесь регулярные выражения, потому что их проще изменить, если вы хотите учитывать границы слов. В вашем вопросе неясно, необходимо ли это.

Комментарии:

1. В первой колонке не всегда есть 2 слова, не могли бы вы изменить свой ответ ?

2. @koler . . . Я не придумывал «2». В вопросе явно говорится о двух компонентах как «имя» и «фамилия», что очень сильно подразумевает, что их два. Если есть известный максимум, я бы просто продолжил использовать regexp_similar() его для обработки. Однако для общего решения вам следует задать другой вопрос.

3. Обратите внимание, что вы, вероятно, хотите regexp_instr , потому regexp_similar что требуется соответствие полной строки.

4. @Fred . … Спасибо.