|
Программирование >> Преобразование значений null
instr(msg,],1,2)-instr(msg,[,1,2)) second val, substr(msg, instr(msg,[,-1,1), instr(msg,],-1,1)-instr(msg, [,-1,1)) last val from V FIRST VAL SECOND VAL LAST VAL [867 [- [5309 [11271978 [4 [Joe [F GET ROWS() [ROSEWOOD...SIR [44400002 [non marked [unit [withabanana? Из приведенного выше результирующего множества видим, что со значениями возвращается и открывающая скобка. Вероятно, вы думаете: Хорошо, верну добавление 1 к INSTR и избавлюсь от начальной квадратной скобки. Зачем вычитать 1? Причина такова: если вернуть добавление без вычитания, в результаты попадут закрывающие квадратные скобки, как можно увидеть ниже: select substr(msg, instr(msg,[,1,1)+1, instr(msg,],1,1)-instr(msg,[,1,1)) first val, substr(msg, instr(msg,[,1,2)+1, instr(msg,],1,2)-instr(msg,[,1,2)) second val, substr(msg, instr(msg,[,-1,1)+1, instr(msg,],-1,1)-instr(msg,[,-1,1)) last val from V FIRST VAL SECOND VAL LAST VAL 867] -] 5309] 11271978] 4] Joe] F GET ROWS()] ROSEWOOD...SIR] 44400002] non marked] unit] withabanana?] На данный момент должно быть понятно: чтобы гарантировать отсутствие квадратных скобок в возвращаемых результатах, необходимо добавить 1 к начальному индексу и отнять 1 из конечного индекса. Как определить количество дней в году (альтернативное решение для Oracle) Задача Требуется определить количество дней в году. Рассматриваемый рецепт представляет альтернативу решению задачи Как определить количество дней в году главы 9. Данное решение подойдет только для Oracle. Решение С помощью функции TO CHAR представьте последнюю дату года как трехзначный порядковый номер дня года: 1 select Days in 2005: 2 to char(add months(trunc(sysdate, y), 12)-1,DDD) 3 as report 4 from dual 5 union all 6 select Days in 2004: 7 to char(add months(trunc( 8 to date(01-SEP-2004),y),12)-1,DDD) 9 from dual REPORT Days in 2005: 365 Days in 2004: 366 Обсуждение Начнем с использования функции TRUNC, чтобы возвратить первый день года соответственно заданной дате: select trunc(to date(01-SEP-2004), y) from dual TRUNC(TO DA 01-JAN-2004 Далее к полученной дате с помощью ADD MONTHS добавляем один год (12 месяцев). После этого вычитаем один день, что возвращает нас в последний день года соответственно исходной дате: select add months( trunc(to date(01-SEP-2004),y), 12) before subtraction, add months( trunc(to date(01-SEP-2004),y), 12)-1 after subtraction from dual BEFORE SUBT AFTER SUBTR 01-JAN-2005 31-DEC-2004 Теперь, получив последний день рассматриваемого года, просто применяем TO CHAR и возвращаем трехзначное число, представляющее, каким по счету днем (первым, пятидесятым и т. д.) является последний день года: select to char( add months( Решение С помощью встроенной функции TRANSLATE замените все буквы и цифры экземплярами определенных символов. Затем выберите только те строки, в которых оба символа встречаются хотя бы по разу. В решении используется синтаксис Oracle, но DB2 и PostgreSQL поддерживают TRANSLATE, поэтому доработать решение, чтобы использовать его для этих платформ, не составит труда: with v as ( select ClassSummary strings from dual union select 3453430278 from dual union select findRow 55 from dual union select 1010 switch from dual union select 333 from dual union select threes from dual select strings trunc(to date(01-SEP-2004),y), 12)-1,DDD) num days in 2004 from dual Поиск смешанных буквенно-цифровых строк Задача Имеется столбец со смешанными буквенно-цифровыми данными. Требуется выбрать строки, содержащие и буквенные, и числовые символы. Иначе говоря, если в строке присутствуют только числа или только буквы, она нас не интересует. Возвращаемые значения должны сочетать в себе буквы и числа. Рассмотрим следующие данные: STRINGS 1010 switch 333 3453430278 ClassSummary findRow 55 threes Окончательное результирующее множество должно содержать только те строки, в которых присутствуют и буквы, и числа: STRINGS 1010 switch findRow 55
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |