#sql #teradata #teradata-sql-assistant #teradatasql
Вопрос:
У меня есть таблица в Teradata SQL, как показано ниже:
col1 col2
Jan Kowal | Jan Kowal PHU
Bravo JohN | GB John BraVo
Ann Still | Ronald G
И мне нужно выбрать только эти строки из приведенной выше таблицы, где:
- В col2 есть значение от col1 что-то большее (неважно, до или после)
- Имейте в виду, что Ян Коваль и Коваль Ян-это имя и фамилия, и они могут быть коммутативными
- Регистр = Ложь (неважно, большая буква или маленькая)
Поэтому мне нужно выбрать только первую и вторую строки:
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 . … Спасибо.