Программирование >>  Преобразование значений null 

1 ... 57 58 59 [ 60 ] 61 62 63 ... 219


select

from

select

iter.pos,

src.name,

substr( src.name,

instr( src.name ,1,iter.pos

instr( src.name ,1,iter.pos+1 ) -

instr( src.name ,1,iter.pos sub

from

(select ,name, as name from V) src,

(select rownum pos from emp) iter

where

iter.pos < length(src.name)-length(replace(src.name ))

where

pos = 2

PostgreSQL

С помощью функции SPLIT PART возвращаем все имена в отдельных строках:

select

from

select

from

where

where

(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

substring(c,2,charindex( c,2)-2)

from

select

pos, name, substring(name, pos, len(name)) as c,

row number() over(

partition by name

order by len(substring(name,pos,len(name))) desc)

from

select

, + csv.name + , as name,

iter.pos

from

V csv,

(select id as pos from t100 ) iter

where

iter.pos <= len(csv.name)+2

where

len(substring(name,pos,len(name))) > 1

substring(substring(name,pos,len(name)),1,1) = ,

where

rn = 2



Следующий шаг - перебрать все элементы каждой строки:

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



EMPS

,mo,larry,curly,

,mo,larry,curly,

,mo,larry,curly,

,larry,curly,

,mo,larry,curly,

,curly,

,tina,gina,]aunita,regina,leena,

,tina,gina,]aunita,regina,leena,

,tina,gina,]aunita,regina,leena,

,gina,]aunita,regina,leena,

,tina,gina,]aunita, regina,leena,

,]aunita, regina,leena,

,tina,gina,]aunita, regina,leena,

,regina,leena,

,tina,gina,]aunita, regina,leena,

,leena,

Это важный шаг, потому что он определяет, как будет получена и-ная подстрока. Обратите внимание, что многие строки были исключены из этого запроса согласно следующему условию 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) = ,



1 ... 57 58 59 [ 60 ] 61 62 63 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика