powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А как написать такой запрос???
10 сообщений из 10, страница 1 из 1
А как написать такой запрос???
    #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
А как написать такой запрос???
    #32061944
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см. Как разобрать строку\r
/topic/14588
...
Рейтинг: 0 / 0
А как написать такой запрос???
    #32061989
Фотография moonmike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И строку то разобрал, но вот у меня же не одна строка а набор, насколько я понял надо делать с помощью курсоров, вот сейчас с ними и мучаюсь.
...
Рейтинг: 0 / 0
А как написать такой запрос???
    #32062008
Фотография 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
А как написать такой запрос???
    #32062024
antonz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-> NNN
это не будет работать если fio разделено несколькими пробелами
...
Рейтинг: 0 / 0
А как написать такой запрос???
    #32062026
Фотография moonmike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2NNN
...
Рейтинг: 0 / 0
А как написать такой запрос???
    #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
А как написать такой запрос???
    #32062035
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 antonz

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

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

2moonmike

так и есть, после id должна быть запятая, пропустил..
...
Рейтинг: 0 / 0
А как написать такой запрос???
    #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
А как написать такой запрос???
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А как написать такой запрос???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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