Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2012, 07:04   #1
Кристина *
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 15
По умолчанию Oracle - вывести работников, в имени или фамилии которых какая-либо буква встречается 2 и более раз

Здравствуйте. Есть задача - нужно вывести в стандартной базе HR данные работников, в имени или фамилии которых какая-либо буква встречается 2 и более раз.
Таким способом считаю число вхождений конкретной буквы, в данном случае 'i' (код 105).

Код:
select *
from hr.employees
where 
    ((length(first_name)-length(replace(first_name,chr(105),'')))/length(chr(105))>=2) 
or ((length(last_name)-length(replace(last_name,chr(105),'')))/length(chr(105))>=2);
Логично было бы сделать цикл, в котором прогоняется код каждой буквы. Не могу найти пример, как бы это можно было реализовать.

Последний раз редактировалось Stilet; 22.11.2012 в 12:17.
Кристина * вне форума Ответить с цитированием
Старый 22.11.2012, 10:22   #2
masax
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 248
По умолчанию

есть функция Instr
Контакты
skype, почта: bm@kwax.ru
masax вне форума Ответить с цитированием
Старый 22.11.2012, 11:05   #3
Кристина *
Пользователь
 
Регистрация: 14.11.2012
Сообщений: 15
По умолчанию

Спасибо. Но даже при использовании этой функции, как перебрать все буквы?
Кристина * вне форума Ответить с цитированием
Старый 22.11.2012, 11:50   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Кристина, а это точно нужно написать SQL запросом? может быть, речь идёт о пользовательской функции (на PL/SQL, например)? вот в ней посчитать, сколько раз повторяются буквы в строке совершенно несложно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2012, 12:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в имени или фамилии которых какая-либо буква встречается 2 и более раз.
Таким способом считаю число вхождений конкретной буквы, в данном случае 'i'
Я может не к месту, но:
Код:
select *
from hr.employees
where 
   first_name like '%i%i%' 
or last_name like '%i%i%'
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2012, 13:09   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если я правильно понял задание, нужно выбрать данные, где ЛЮБАЯ буква встречается 2 и более раз..
а раз любая - значит нужно перебор/цикл делать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2012, 13:12   #7
masax
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 248
По умолчанию

поиск кол-ва символа в строке делается так как ты написала сверху
циклы можно сделать только в пользовательской функции

самый оптимальный способ решения задачи предложил Stilet
Контакты
skype, почта: bm@kwax.ru
masax вне форума Ответить с цитированием
Старый 22.11.2012, 13:46   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если я правильно понял задание
Ну да
Совершенно правильно. Именно поэтому такие вещи упаковываются в функцию, возвращающую таблицу, где, как ты правильно заметил можно параметр установить.
Однако автор кагбэ намекнула:
Цитата:
в данном случае 'i'
Откуда-то она эту букву берет же? Заметь - под нее даже запрос подогнан. С клиента? Если да то пусть на стороне клиента и формируется строка запроса
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.11.2012, 14:18   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я намекал на такой вариант решения:

Код:
create or replace function IsDublicateCharInString(s1 in varchar2) return char is

    OneL char;
    i number;
begin
  if (Length(Trim(s1))=0) or (trim(s1) is null) then 
     return 'N';
  else 
     for i in 1..Length(s1)-1 loop
       OneL := substr(s1,i,1);
       if OneL<>' ' then
         if instr(substr(s1,i+1), OneL)>0 then
            return 'Y';         
         end if;   
       end if;   
     end loop;
     return 'N';
  end if;   
end IsDublicateCharInString;
пользоваться так:
Код:
select * from hr.employees
where 
  IsDublicateCharInString(first_name) = 'Y'
  or 
  IsDublicateCharInString(last_name) = 'Y'

хотя, не спорю, может быть, я задание и не так понял...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2012, 02:43   #10
Stormik
 
Регистрация: 27.11.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от masax Посмотреть сообщение
самый оптимальный
Эх... тебе бы эту фразу нашей математичке бы сказать... Сразу выгоняла с экзамена с "неудом"!
Ибо "оптимум" есть предел функции. И "самый оптимальный" - масло масляное..

Последний раз редактировалось Stormik; 28.11.2012 в 02:51.
Stormik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить количество слов, в которых буква 'П' встречается хотя бы один раз. edgeks Помощь студентам 0 18.11.2012 15:34
Дано предложение. Выведите на экран те слова в которых буква "о" встречается дважды. Кристинааа Паскаль, Turbo Pascal, PascalABC.NET 5 08.06.2011 15:25
Текстовый файл, из предложения выбросить слова в которых встречается определённая буква. (Паскаль) serhan Помощь студентам 14 25.04.2011 15:29
найти все слова, в которых заданный символ встречается не менее чем заданное число раз. Delphi. Виктория7777 Помощь студентам 6 21.12.2010 18:46
Множества. Вывести в алфавитном порядке все буква текста, входящие в него более двух раз ilyas22 Паскаль, Turbo Pascal, PascalABC.NET 5 23.05.2010 12:50