Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А как написать такой запрос??? / 10 сообщений из 10, страница 1 из 1
25.10.2002, 14:20:54
    #32061933
moonmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
В SQLServer'e новичок, потому такие вопросы и возникают.
есть таблицы:
t1(id bigint(8),FIO varchar(150)),
t2(id bigint(8),F varchar(100),I varchar(100),O varchar(100))
необходимо ФИО из t1 разбить на Ф,И,О и вставить в t2


Заранее спасибо!!!
...
Рейтинг: 0 / 0
25.10.2002, 14:45:16
    #32061944
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
см. Как разобрать строку\r
/topic/14588
...
Рейтинг: 0 / 0
25.10.2002, 15:39:01
    #32061989
moonmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
И строку то разобрал, но вот у меня же не одна строка а набор, насколько я понял надо делать с помощью курсоров, вот сейчас с ними и мучаюсь.
...
Рейтинг: 0 / 0
25.10.2002, 16:16:11
    #32062008
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
Код: plaintext
1.
2.
3.
4.
5.
6.
insert into t2 
select id
substring(fio, 1 ,charindex(' ',fio, 1 ) 1 ) as f, 
substring(fio,charindex(' ',fio, 1 )+ 1 ,charindex(' ',fio,charindex(' ',fio, 1 )+ 1 )-charindex(' ',fio, 1 )) as i,
substring(fio,charindex(' ',fio,charindex(' ',fio, 1 )+ 1 ),len(fio)) as o 
from t1
...
Рейтинг: 0 / 0
25.10.2002, 17:00:32
    #32062024
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
-> NNN
это не будет работать если fio разделено несколькими пробелами
...
Рейтинг: 0 / 0
25.10.2002, 17:04:40
    #32062026
moonmike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
2NNN
...
Рейтинг: 0 / 0
25.10.2002, 17:25:18
    #32062031
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
declare @ss varchar( 50 ) set @ss='12345 123456789 123456789123456'
declare @s1 varchar( 50 ),@s2 varchar( 50 ),@s3 varchar( 50 )
set @s1 = substring(@ss, 1 ,charindex(' ',@ss, 1 ))
print @s1
set @s2 = substring(@ss,charindex(' ',@ss, 1 )+ 1 ,charindex(' ',@ss,charindex(' ',@ss, 1 )+ 1 )-charindex(' ',@ss, 1 ))
print @s2
set @s3 = substring(@ss, charindex(' ',@ss,charindex(' ',@ss)+ 1 )+ 1  ,len(@ss))
print @s3
...
Рейтинг: 0 / 0
25.10.2002, 17:40:52
    #32062035
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
2 antonz

> это не будет работать если fio разделено несколькими пробелами

В условии об этом не сказано :)

2moonmike

так и есть, после id должна быть запятая, пропустил..
...
Рейтинг: 0 / 0
25.10.2002, 21:52:46
    #32062092
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
ну зачем так сложно.... в квадратных скобочках указывайте свои разделители...... можно кстати несколько
если это пробелы,табуляции,переводы строк
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
declare @s varchar( 20 )
set @s='1234  4567     890'
select f,
         left(io,patindex('%[ ]%',io)- 1 ) as i,
         ltrim(right(io,len(io)-patindex('%[ ]%',io))) as o
from (select left(@s,patindex('%[ ]%',@s)- 1 ) as f,
                 ltrim(right(@s,len(@s)-patindex('%[ ]%',@s))) as io
       ) a
...
Рейтинг: 0 / 0
26.10.2002, 02:17:03
    #32062111
antonz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А как написать такой запрос???
По моему приведение строки к "нормальному" виду (без лишних пробелов) и разбор строки по любому разделителю требуется довольно часто. Поэтому имеет смысл использовать ф-ции.
Код: plaintext
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.
CREATE FUNCTION dbo.NotDoubleSpace (@ss varchar( 3500 ))  
RETURNS  varchar( 3500 )  AS  
 -- нормализует строку
 
BEGIN 
	declare	@s1 varchar( 50 ),
		@i int 
	set @ss=ltrim(rtrim(@ss))
	set @i=patindex( '%  %' , @ss )
	while @i> 0  begin
		set @s1=substring( @ss , @i , len(@ss) )
		set @ss = stuff( @ss , @i , len(@s1)-len(ltrim(@s1))  , ' ' )
		set @i=patindex( '%  %' , @ss )
	end
	return @ss
END
GO

CREATE FUNCTION dbo.ParseSting (@s1 varchar( 3500 ) , @hr varchar( 10 ), @pos int)  
RETURNS varchar( 3500 ) AS  
 --возвращает часть строки @pos; разделитель @hr
 
BEGIN 
	declare @i int set @i= 0 
	while  @i<@pos begin
		set @s1 =  substring(@s1,charindex(@hr ,@s1)+ 1 ,len(@s1)) 
		set @i=@i+ 1 
	end
	set @i=charindex(@hr ,@s1)
	if @i> 0  set @s1 = substring(@s1, 0 ,@i) 
	return @s1
END
GO

Пример использования
Код: plaintext
1.
2.
3.
declare @ss varchar( 50 ) set @ss='     a12345 b123456789          c1234567  d89012345    '
select dbo.ParseSting( dbo.NotDoubleSpace(@ss) , ' ' ,  0  ) as F ,
	 dbo.ParseSting( dbo.NotDoubleSpace(@ss) , ' ' ,  1  ) as I, 
	dbo.ParseSting( dbo.NotDoubleSpace(@ss) , ' ' ,  2  ) as O

а применительно к поставленной задаче
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table #t1(fio varchar( 150 ))
create table #t2(f varchar( 50 ) , i varchar( 50 ) , o varchar( 50 ))
insert into #t1 values('   a123    b123456      c123456789123')
insert into #t2 select dbo.ParseSting( dbo.NotDoubleSpace(fio) , ' ' ,  0  ) as F ,
	 dbo.ParseSting( dbo.NotDoubleSpace(fio) , ' ' ,  1  ) as I, 
	dbo.ParseSting( dbo.NotDoubleSpace(fio) , ' ' ,  2  ) as O from #t1
select * from #t2
drop table #t1 drop table #t2
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А как написать такой запрос??? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]