для этого задания я должен вернуть имена столбцов во всех таблицах от определенного пользователя, где имя столбца имеет не менее 2 гласных, а его длина превышает 8. Я знаю, что sql может обрабатывать регулярное выражение, к сожалению, я не знаю знать, можно ли его использовать в этом случае.
Вот практический пример того, что я хочу, чтобы мой запрос делал.
Имя таблицы | Имя столбца |
---|---|
Человек | идентификация |
Человек | название |
Человек | фамилия |
Город | континент |
Город | страна |
Город | название |
Город | Прочность |
Имя таблицы | Имя столбца |
---|---|
Человек | идентификация |
Человек | фамилия |
Город | континент |
Я использую СУБД Oracle. Спасибо за ваше время
В этом случае нет необходимости в соединении между собой. Поскольку все, что я ищу, это название столбцов
@nbk Я не думаю, что взаимосвязь данных имеет здесь какое-то значение. OP просто хочет вернуть строки из этой таблицы с этими двумя столбцами, которые соответствуют их требованиям (2 или более гласных, более 8 символов)
Translate()
и replace()
могут помочь
Я уверен, что регулярное выражение могло бы быть немного более элегантным, но что-то вроде следующего поможет вам приблизиться:
SELECT * FROM yourtable WHERE regexp_like(ColumnName, '^.*[aeiou]+.*[aeiou]+.*$', 'i') and LENGTH(ColumnName) > 8
Я не знал, как использовать regexp_like, это отличный пример, спасибо!
Регулярное выражение может быть намного проще, так как нет необходимости сопоставлять всю строку. Например, [aeiou].*?[aeiou]
(это гласная, а затем ноль или более символов, пока не будет найдена следующая гласная).
Используемые функции:
Примечания:
Демо Обратите внимание на комментарии для более простого решения, которое позволяет избежать замены путем включения ~ в перевод.
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 |
+------------+----------------+---------+
Опять же, я использую ~ как специальный символ, если какое-либо имя столбца содержит его в качестве значения, запись будет возвращена неточно.
Спасибо, кажется, работает именно так, как я хотел
@JuanAndresMendez Вы можете упростить запрос и избавиться от проблемы с ~
, например, используя TRANSLATE(column_name, '~aeiou', '~')
и не беспокоясь о функции REPLACE
дб <> рабочий пример
@MT0 хорошо, должен признать, это довольно круто. Даже если значение поля записи содержит ~, оно не затрагивается.
Вот один из способов: сравните длину слова с длиной слова после удаления гласных.
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]'
);
Это ищет
как соотносятся город и человек, должна быть колонка, указывающая на город