|
Программирование >> Преобразование значений null
PostgreSQL С помощью функции SPLIT PART возвращаем все имена в отдельных строках:
(select cast(name as text) as name from v) src iter.pos <= length(src.name)-length(replace(src.name, ) x SQL Server После обхода значений столбца NAME, возвращенных представлением V, с помощью функции ROW NUMBER выбираем из каждой строки только второе имя:
Следующий шаг - перебрать все элементы каждой строки: select pos, name, substr(name, pos) c, row number() over(partition by name order by length(substr(name, pos)) desc) rn from ( select ,csv.name, as name, cast(iter.pos as integer) as pos from v csv, (select row number() over() pos from t100 ) iter where iter.pos <= length(csv.name)+2 ) x where length(substr(name,pos)) > 1 POS EMPS C RN 1 ,mo,larry,curly, ,mo,larry,curly, 1 2 ,mo,larry,curly, mo,larry,curly, 2 3 ,mo,larry,curly, o,larry,curly, 3 4 ,mo,larry,curly, ,larry,curly, 4 Теперь, имея доступ ко всем частям строки, просто выбираем необходимые строки представления. Нас интересуют строки, начинающиеся с запятой; остальные можно отбросить: select pos, name, substr(name,pos) c, row number() over(partition by name order by length(substr(name, pos)) desc) rn from ( select ,csv.name, as name, cast(iter.pos as integer) as pos from v csv, (select row number() over() pos from t100 ) iter Обсуждение DB2 и SQL Server Синтаксис для этих двух СУБД немного отличается, но техника - одна. Обсудим ее на примере решения для DB2. Выполняется обход строки, результаты представляются вложенным запросом Х: select ,csv.name , as name, iter.pos from v csv, (select row number() over() pos from t100 ) iter where iter.pos <= length(csv.name)+2 EMPS POS ,tina,gina,jaunita,regina,leena, 1 ,tina,gina,jaunita,regina,leena, 2 ,tina,gina,jaunita,regina,leena, 3
Это важный шаг, потому что он определяет, как будет получена и-ная подстрока. Обратите внимание, что многие строки были исключены из этого запроса согласно следующему условию WHERE: substr(substr(name,pos),1,1) = , Заметим, что строка ,larry, curly, имела ранг 4, а сейчас он равен 2. Вспомним, что предикат WHERE обрабатывается раньше SELECT. Таким образом, сохраняются строки, первым символом которых является запятая, после этого ROW NUMBER ранжирует их. В данный момент легко увидеть, что чтобы получить n-ную подстроку, необходимо выбрать строки, где значение RN равно п. Последний шаг - выбрать интересующие нас строки (в данном случае те, в которых RN равно 2) и с помощью SUBSTR извлечь из них имя. Выбрать требуется первое имя строки: larry из , larry,curly, и gina из ,gina,jaunita, regina, leena,. MySQL Вложенный запрос Х выполняет обход всех строк. Определить количество значений в строке можно, подсчитав число разделителей в ней: select iter.pos, src.name from (select id pos from t10) iter, V src where iter.pos <= length(src.name)-length(replace(src.name ,)) +------+-------------------------------- + pos name +------+-------------------------------- + 1 mo,larry,curly 2 mo,larry,curly 1 tina,gina,]aunita,regina,leena 2 tina,gina,]aunita,regina,leena 3 tina,gina,]aunita,regina,leena 4 tina,gina,]aunita,regina,leena +------+-------------------------------- + where iter.pos <= length(csv.name)+2 ) x where length(substr(name,pos)) > 1 and substr(substr(name,pos),1,1) = ,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |