SQL получает все столбцы от пользователя, который имеет не менее 2 гласных в имени столбца, а также его длина превышает 8 в СУБД ORACLE

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

Вот практический пример того, что я хочу, чтобы мой запрос делал.

Вот существующие таблицы и столбцы

Имя таблицыИмя столбца
Человекидентификация
Человекназвание
Человекфамилия
Городконтинент
Городстрана
Городназвание
ГородПрочность

Вот желаемый результат запроса

Имя таблицыИмя столбца
Человекидентификация
Человекфамилия
Городконтинент

Я использую СУБД Oracle. Спасибо за ваше время

как соотносятся город и человек, должна быть колонка, указывающая на город

nbk 22.03.2022 19:55

В этом случае нет необходимости в соединении между собой. Поскольку все, что я ищу, это название столбцов

Juan Andres Mendez 22.03.2022 19:58

@nbk Я не думаю, что взаимосвязь данных имеет здесь какое-то значение. OP просто хочет вернуть строки из этой таблицы с этими двумя столбцами, которые соответствуют их требованиям (2 или более гласных, более 8 символов)

JNevill 22.03.2022 19:58
Translate() и replace() могут помочь
xQbert 22.03.2022 20:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
41
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я уверен, что регулярное выражение могло бы быть немного более элегантным, но что-то вроде следующего поможет вам приблизиться:

SELECT * FROM yourtable WHERE regexp_like(ColumnName, '^.*[aeiou]+.*[aeiou]+.*$', 'i') and LENGTH(ColumnName) > 8

Я не знал, как использовать regexp_like, это отличный пример, спасибо!

Juan Andres Mendez 22.03.2022 20:38

Регулярное выражение может быть намного проще, так как нет необходимости сопоставлять всю строку. Например, [aeiou].*?[aeiou] (это гласная, а затем ноль или более символов, пока не будет найдена следующая гласная).

MT0 22.03.2022 21:36
Ответ принят как подходящий

Используемые функции:

  • Перевести изменить символы из текста в текст, идентифицированный
  • Заменять заменить значение в строке с одного значения на другое.
  • Длина считает символы в строке.

Примечания:

  • Поскольку вы указали, что регулярные выражения нельзя использовать...
  • мы используем перевод, чтобы удалить все гласные, установив для них специальный символ «~». Хотя я полагаю, что мы могли бы просто использовать пробел ' '.
  • Переводить нельзя в пустую строку, но можно заменить.
  • «Специальный» символ «~» в переводе, поэтому, если имя столбца имеет один из них, это может привести к неправильному результату для обхода ограничения, которое не может быть пустым.
  • заменить, чтобы устранить специальный символ.
  • length, чтобы убедиться, что мы удалили хотя бы 1 гласную.
  • Включен столбец «Z», чтобы показать вам, что делают перевод и замена.
  • не идеален с точки зрения производительности из-за невозможности использовать индексы из-за того, что мы используем функции для данных и ограничиваемся этими измененными данными.

Демо Обратите внимание на комментарии для более простого решения, которое позволяет избежать замены путем включения ~ в перевод.

WITH CTE AS (SELECT 'Person' "Table name", 'identification' "Column name" from dual union all
SELECT 'Person','name' from dual union all
SELECT 'Person','last_name' from dual union all
SELECT 'City','continent' from dual union all
SELECT 'City','country' from dual union all
SELECT 'City','name' from dual union all
SELECT 'City','Strength' from dual)

SELECT "Table name", "Column name", replace(translate("Column name",'aeiou','~'),'~','') z
FROM CTE
WHERE length("Column name")-length(replace(translate("Column name",'aeiou','~'),'~',''))>=2
  and length("Column name")>8

Предоставление нам:

+------------+----------------+---------+
| Table name |  Column name   |    Z    |
+------------+----------------+---------+
| Person     | identification | dntfctn |
| Person     | last_name      | lst_nm  |
| City       | continent      | cntnnt  |
+------------+----------------+---------+

Опять же, я использую ~ как специальный символ, если какое-либо имя столбца содержит его в качестве значения, запись будет возвращена неточно.

xQbert 22.03.2022 20:28

Спасибо, кажется, работает именно так, как я хотел

Juan Andres Mendez 22.03.2022 20:37

@JuanAndresMendez Вы можете упростить запрос и избавиться от проблемы с ~, например, используя TRANSLATE(column_name, '~aeiou', '~') и не беспокоясь о функции REPLACEдб <> рабочий пример

MT0 22.03.2022 21:47

@MT0 хорошо, должен признать, это довольно круто. Даже если значение поля записи содержит ~, оно не затрагивается.

xQbert 23.03.2022 13:39

Вот один из способов: сравните длину слова с длиной слова после удаления гласных.

with data as (   
  select 'outLOOK' as word from dual union all    
  select 'today' as word from dual union all    
  select 'help' as word from dual    
)   
  SELECT  word
FROM    data
WHERE    LENGTH (word)
      - NVL ( LENGTH ( TRANSLATE ( word
                           , 'xAEIOUaeiou'
                 , 'x'
                 )
             )
        , 0
        ) >= 2
;

Или

with data as (   
  select 'outLOOK' as word from dual union all    
  select 'today' as word from dual union all    
  select 'help' as word from dual    
)   
SELECT  word
FROM    data
WHERE    REGEXP_LIKE ( word
            , '[AEIOUaeiou].*[AEIOUaeiou]'
            );

Это ищет

  • гласная
  • любое количество символов, от 0 и более
  • другая гласная.

Другие вопросы по теме