2010-06-30

Citibank

5 минут в офисе Сити и они потеряли клиента, кт. быть может и несколько млн положил бы на счет.

Первый раз прибыл в Ситибанк в 9:45, с удивлением обнаружил, что офис еще не работает. Ну ладно, работают зато до 20:00.

Прихожу в другой день около 11. Удивляюсь очереди (2-3 человека) к банкомату и еще столько же в очереди в кассу. Первый попавшийся консультант-операционист общается по телефону. Машет рукой, что можно присесть. Видимо разговор заканчивается. Разговор по работе. Нормальная ситуация.
Ок, начали беседу. Я хочу их продукт CitiOne, карточку, сберегательный счет, овердрафт не нужен. На всякий случай сразу же спрашиваю: могу ли я потом получить выписку о состоянии счета на английском языке, сколько это будет стоить? Операционист предлагает мне узнать об этом в кассе!!! Сам он ничего не знает.
Я весьма удивляюсь нахальству (вспоминая, что там очередь) и предлагаю ему самому об этом узнать. Он пошел. Слышу диалог с кассиром, понимаю что тухлое дело. Решил тоже подойти. Тут же подскакивает охранник и предлагает мне вернуться за линию перед кассой (охраник без опозновательных знаков и без униформы).
Результат: выписку они сделать могут, но ее ждать надо неопределенный срок, не меньше недели. Операционист еще и ухмыляется, что дескать выписку на английском делают в зарубежных офисах, а в России не могут вот так просто. Международный банк :(

Теперь идем в Райффайзен. Пусть там все за деньги, но если подход к клиенту лучше, то они получат клиента.

2010-06-16

Список значений в набор строк

Необычная задача - преобразовать список значений разделенных запятыми в набор строк.
Имеем некую таблицу lists, в поле code которой имеем некоторые списки значений через запятую (111,222,333 и т.п.). В результате следующего запроса получаем выборку уникальных значений всех списков из таблицы lists, каждое находится в отдельной строке.

select distinct code
  from
    (select regexp_substr(q.code, '[^,]+', 1, rownum) code
     from dual,
        (select length(regexp_replace(wm_concat(l.code), '[^,]'))+1 l_cnt
           ,wm_concat(l.code) code
      from lists l
       ) q
     connect by rownum <= q.l_cnt
    )
where code is not null;

P.S. используем конструкцию вида select rownum from dual connect by rownum <= :counter для генерации нужного нам числа строк.

2010-06-01

Загадочные конструкции в коде

Часто занимаюсь отладкой и чтением чужого кода. Иногда попадаются странные куски. Буду наверное публиковать, а то потом забывается.
- nvl(vStr, '') - между кавычками пробела нет!
- select ... from... where nvl(vNum, 1) = 0 - чем не понравилось сравнивать сразу с 0м непонятно, зато усложнили работу оптимизатора в борьбе с null-ами
- if trunc(abs(vSum)*100)/100 != 0 then - долго ломал голову, пока Amd не подсказал. Тут замаскировано: abs(vSum) < 0.01