Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Открыть новую тему     Написать ответ в эту тему

llleopevzner

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то так:
 
declare
  testing_string varchar2(50);
  pattern_string varchar2(50);
  function tst(aStr in varchar2) return varchar2
  is
    res varchar2(200);
  begin
    for i in (select substr(mask,level,1) lt,level lvl from (select aStr mask from dual) t connect by level<=length(mask)) loop
      if instr('0123456789',i.lt)>0 then res:=res||'('||i.lt||')';
      elsif i.lt='_' then res:=res||'([[:digit:]])';
      else  
        if instr(aStr,i.lt)<i.lvl then res:=res||'(\'||instr(aStr,i.lt)||')';
        else res:=res||'([[:digit:]])';
        end if;
      end if;          
    end loop;
    return res;
  end;
begin
  testing_string:='121223322';
  pattern_string:='1_1AABBAA';
  if regexp_like(testing_string,tst(pattern_string)) then  
    dbms_output.put_line('match');
  else  
    dbms_output.put_line('not match');
  end if;
end;

Всего записей: 32 | Зарегистр. 11-12-2005 | Отправлено: 13:25 17-05-2017
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть табличка со столбцом DATE_TIME и столбцом типа NUMBER:
DT            A
03.05.2011 00:00        1
02.05.2011 23:20        4
02.05.2011 23:01        4
02.05.2011 23:00        4
02.05.2011 22:16        3
02.05.2011 22:05        3
02.05.2011 22:00        7
 
Подскажите, как из нее получить следующее:
DT            A
03.05.2011 00:00        9
02.05.2011 23:00        10
02.05.2011 22:00        7
 
Т.е. необходимо посчитать сумму по часам за период (23.01..00.00 включительно, 22.01..23.00 и т.д.).
 
Пробовал вариант с GROUP BY по TRUNC(DT, 'HH24'), но он суммирует за период 23.00..23.59 и т.д.

Всего записей: 1128 | Зарегистр. 19-08-2005 | Отправлено: 20:47 11-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Unnicked
В начале dateadd-ом DT на минуту назад сдвинуть...

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 21:03 11-08-2017 | Исправлено: Alexzzy, 23:29 11-08-2017
Unnicked

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
А одним запросом возможно?

Всего записей: 1128 | Зарегистр. 19-08-2005 | Отправлено: 10:06 13-08-2017
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Unnicked
Вы же свой результат с group by одним запросом получили?
Просто из DT вычтите минуту тем способом, который поддерживает ваша СУБД.

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 13:52 13-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток!
Давно не брал в руки шашек, но админ заболел - приходится самому разбираться на хозяйстве.
Задачу поставили такую: есть каскад связанных таблиц, из таблицы_1 по условию отбираются id1, по этим id1 из таблицы_2 выбираются id2 и по ним из таблицы_3 тянутся данные.
Точно помню, что городить запрос select data from table3 t3 where t3.id in (select id2 from table_2 t2 where t2.id in (select id1 from table_1 t1 where t1.param like '%someshit%') это лютый звездец и ваще не взлетит.
В какую сторону мне копнуть, чтобы красиво реализовать запрос?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 15:01 15-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Типа такого
select t3.data  
from table_1 t1, table_2 t2, table3 t3  
where t1.param like '%someshit%' and
    t1.id1 = t2.id1 and
    t2.id2 = t3.id2

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 17:40 15-08-2017 | Исправлено: Alexzzy, 17:41 15-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Типа такого
select t3.data  
from table_1 t1, table_2 t2, table3 t3  
where t1.param like '%someshit%' and
    t1.id1 = t2.id1 and
    t2.id2 = t3.id2

Благодарствую, попробовал. Работает, но дооооолго.
Запилил с join'ами - тоже работает, но тоже дооооолго.
select data.t3 from table3 t3
left join table2 t2
on t3.id3=t2.id2
left join table1 t1
on t2.id2=t1.id1
where
t1.param like '%someshit%'
 
Быстрее всего руками выполнить три запроса подряд и подставить результаты одного в другой

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:47 15-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
но дооооолго

Значит структура не оптимальная без первичных ключей и индексов.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 20:27 15-08-2017
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, при наличии индексов столь тривиальный запрос должен отрабатывать очень быстро. Хотя конечно может у вас там исходные таблицы в сотни ТБ

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 11:12 17-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да, при наличии индексов столь тривиальный запрос должен отрабатывать очень быстро. Хотя конечно может у вас там исходные таблицы в сотни ТБ

Если бы... Просто база унылое Г - индексы делали кое-где и кое-как, fk - на одной таблице из пяти есть и это в лучшем случае.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 15:48 18-08-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Админ за что деньги то получает? Проиндексировать не проблема.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 20:23 18-08-2017 | Исправлено: Alexzzy, 20:23 18-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Админ за что деньги то получает? Проиндексировать не проблема.

Знал бы прикуп - жил бы не там, где живу
 
Продолжают свой секс с sql'ем.  
Нужно в запросе вернуть данные из одной таблицы с заменой (замену делаю case'ом), но если встречается определенный id'шник, то надо слазить в другую таблицу, посмотреть на id в ней и если он равен 1, то 1 и вернуть, если <> 1, то вернуть 2). Такое ощущение, что в case надо засунуть select с еще одним case'ом... Но, если память мне не изменяет - так не летает...

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:06 21-08-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С таким лайком %someshit% и не взлетит. Нужен полнотекстовый поиск/индекс. А это уже сецифично для конкретной СУБД.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 17:12 21-08-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
Такое ощущение, что в case надо засунуть select с еще одним case'ом

Попробуйте:  

Код:
 
select data.t3  

, CASE WHEN  t4.{id} = 1 THEN 1
  ELSE 2 END AS new_value

from table3 t3
left join table2 t2
on t3.id3=t2.id2
left join table1 t1
on t2.id2=t1.id1

RIGHT JOIN {some_table} t4
ON t4.{id} = t3.id3    

where
t1.param like '%someshit%'  
 

Заменить {some_table} на нужное имя
Заменить ON t4.{id} = t3.id3 на нужную связь по table и полю
Заменить RIGHT JOIN на LEFT JOIN или INNER JOIN по условию связи tables
Заменить t4.{id} в CASE

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 04:07 22-08-2017 | Исправлено: dneprcomp, 06:42 22-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
Благодарствую, взял твой пример и нагородил. Работает

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 11:48 22-08-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени участникам забега.
Есть у меня такая вот функция (не мной писанная).  
function TimeX return number is
TimeX number(10,8);
begin
  select to_number(sStr)
    into TimeX
    from Params
    where sName = 'Time1';
 
  return TimeX;
 
exception when others then
  return 30;
end TimeX;
 
Насколько я понял идею - он должна из таблички Params вытаскивать значение поля (в поле стоит значение 3), в случае ловли клина - возвращать 30...
Так вот клин ловится постоянно Ни разу не видел, чтобы вернулось значение 3.
Но если тестить вручную, то все ок - возвращает 3.
Как понять - где ловится клин?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:33 06-09-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
вызов функции с ошибкой и тестирование проводятся под одним логином?
Попробуйте в строчке "from params" перед params добавить название схемы. И при обращении к функции - тоже.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 15:47 06-09-2017
akaBadSanta



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
для начала я бы проверил результат выборки, под тем же пользователем
select sStr
from Params  
where sName = 'Time1';
 
если значения конвертируемые в number и их больше одного, то вероятно тут клин, rownum = 1 поможет

Всего записей: 11 | Зарегистр. 08-09-2011 | Отправлено: 23:25 06-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2
Да, под одним. Пробовал указывать схему. При тестирование как ни извращайся - все ок
 
akaBadSanta
В том то и дело, что значение там одно...
 
P.S. Благодарствую за советы! Кажется разобрался. Клин ловится несколько раньше в процедуре судя по всему. Но почему возвращается значение по исключению из этой функции - вопрос остается.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 18:26 07-09-2017 | Исправлено: NiXXX, 11:13 08-09-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru