Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите распарсить строку  [new]
Andrew_vb1110
Member

Откуда: Симферополь
Сообщений: 538
Помогите распарсить фамилию, имя, отчество. Разделены пробелом.
Фамилию получилось отделить, а дальше не знаю...

declare  @a varchar(250), @pos_f integer, @fam varchar(250)
set @a = 'Фамилия Имя Отчество'
set @pos_f = (select CHARINDEX(' ', @a))
set @fam = (select left(@a, @pos_f ))
print @fam
3 июн 10, 10:16    [8882497]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml#iter-list-of-strings
3 июн 10, 10:19    [8882532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Вот, например, была тема: Кто лучше? (Фамилия Имя Отчество - > Фамилия И. О. )
Можно и ещё поискать - много таких тем было.
3 июн 10, 11:26    [8883321]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Вот ещё: https://www.sql.ru/forum/actualthread.aspx?tid=704897&pg=-1
3 июн 10, 11:37    [8883432]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
Однорукий ламер
Member

Откуда: Санкт-Петербург
Сообщений: 74
Вот такой алгоритм работает у нас

DECLARE @str varchar(150)
DECLARE @F varchar(50)
DECLARE @N varchar(50)
DECLARE @SN varchar(50)

SET @str = 'Иванов Иван Иванович'
SET @F = ''
SET @N = ''
SET @SN = ''


SET @str = REVERSE(Replace(@str,' ','.'))
SET @F = REVERSE(PARSENAME(@str, 1))
SET @N = REVERSE(PARSENAME(@str, 2))
SET @SN = REVERSE(PARSENAME(@str, 3))

SET @F = ISNULL(STUFF(LOWER(@F),1,1, UPPER(LEFT(@F,1))),@F)
SET @N = ISNULL(STUFF(LOWER(@N),1,1, UPPER(LEFT(@N,1))),@N)
SET @SN = ISNULL(STUFF(LOWER(@SN),1,1, UPPER(LEFT(@SN,1))),@SN)

SELECT @F as Фамилия, @N as Имя, @SN as Отчество
3 июн 10, 11:44    [8883499]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Однорукий ламер,

это если гарантируется, что разделитель - всегда один пробел.
И всегда не более трёх компонент в фамилии-имени-отчестве.
3 июн 10, 11:51    [8883565]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
Однорукий ламер
Member

Откуда: Санкт-Петербург
Сообщений: 74
Естественно, это не панацея от всего-всего.
В подобных задачах всегда есть ограничение на входные данные.
Универсального инструмента не существует.

Это алгоритм, а как его использовать по месту дело индивидуальное

К тому же у автора топика было четкое условия 'Фамилия Имя Отчество'
3 июн 10, 12:06    [8883716]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите распарсить строку  [new]
CheaterX
Member

Откуда:
Сообщений: 61
SELECT 
parsename(replace([ФИО],' ','.'),3),
 parsename(replace([ФИО],' ','.'),2),
 parsename(replace([ФИО],' ','.'),1)
30 мар 15, 08:54    [17448093]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
CheaterX,

зачем меня откопал, гробокопатель?!
30 мар 15, 12:17    [17449233]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
iap
CheaterX,

зачем меня откопал, гробокопатель?!


кстати у одно у меня конкатенация с нулевым символом вырезает строку?

https://www.sql.ru/forum/415382/udalenie-lishnih-probelov-iz-stroki#3991127

DECLARE
       @x VARCHAR(255),
       @replacement CHAR(1)

SET @x = 'a      b  c de f'
SET @replacement = CHAR(0)

SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, ' ', ' '+@replacement)
SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, @replacement+' ', '')
SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, @replacement, '')
SELECT @x, LEN(@x), DATALENGTH(@x)

a b c de f 16 16
a 26 26
a 16 16
a 16 16


DECLARE
       @x VARCHAR(255),
       @replacement CHAR(1)

SET @x = 'a      b  c de f'
SET @replacement = CHAR(1)

SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, ' ', ' '+@replacement)
SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, @replacement+' ', '')
SELECT @x, LEN(@x), DATALENGTH(@x)
SET @x = REPLACE(@x, @replacement, '')
SELECT @x, LEN(@x), DATALENGTH(@x)


a b c de f 16 16
a      b  c de f 26 26
a b c de f 14 14
a b c de f 10 10


Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Feb 10 2012 19:39:15 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
31 мар 15, 01:32    [17452506]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
felix_ff
кстати у одно у меня конкатенация с нулевым символом вырезает строку?
Переключите вывод студии в текстовый режим.
31 мар 15, 08:24    [17452664]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
invm
felix_ff
кстати у одно у меня конкатенация с нулевым символом вырезает строку?
Переключите вывод студии в текстовый режим.


тт, что то я и запамятовал описание replace :(

https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
Символ 0x0000 (char(0)) не определен в параметрах сортировки Windows, и его нельзя включать в REPLACE
31 мар 15, 14:32    [17454563]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
felix_ff,

не, не в REPLACE дело, именно в char(0).
вот у меня было с похожее: подскажите по image (binary)
ну или выполните в студии
select cast (0x002057 as varchar(200)) as with_00

с выводом в грид и в текст, почувствуйте разницу
31 мар 15, 14:41    [17454623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
felix_ff
invm
пропущено...
Переключите вывод студии в текстовый режим.


тт, что то я и запамятовал описание replace :(

https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
Символ 0x0000 (char(0)) не определен в параметрах сортировки Windows, и его нельзя включать в REPLACE


select
	cast(N'Тест! тест!' as varbinary(8000)) orig_text,
	cast(replace(cast(N'Тест! тест!' as varbinary(8000)), cast(N'!' as varbinary(8000)), 0x0000) as varbinary(8000));


output
0x22043504410442042100200042043504410442042100
0x22043504410442040000200042043504410442040000
31 мар 15, 14:41    [17454624]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
churupaha
felix_ff
пропущено...


тт, что то я и запамятовал описание replace :(

https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
Символ 0x0000 (char(0)) не определен в параметрах сортировки Windows, и его нельзя включать в REPLACE


select
	cast(N'Тест! тест!' as varbinary(8000)) orig_text,
	cast(replace(cast(N'Тест! тест!' as varbinary(8000)), cast(N'!' as varbinary(8000)), 0x0000) as varbinary(8000));


output
0x22043504410442042100200042043504410442042100
0x22043504410442040000200042043504410442040000


o-o, churupaha

так проблема не в замене какого то символа на CHAR(0), а именно удаления CHAR(0) из строки
видать где то я торможу или лыжи не едут

declare @x varchar(20)

set @x = CHAR(97)+CHAR(32) + CHAR(0)+CHAR(98)

select cast(@x as varbinary(max)),
       cast(CHAR(0) as Varbinary(max)),
       cast(CHAR(32) as varbinary(max))

set @x = REPLACE(@x, CHAR(0), '')

select cast(@x as varbinary(max)), @x

set @x = CHAR(97)+CHAR(32) +CHAR(98)

select cast(@x as varbinary(max)),
       cast(CHAR(0) as Varbinary(max)),
       cast(CHAR(32) as varbinary(max))

set @x = REPLACE(@x, CHAR(0), '')

select cast(@x as varbinary(max)), @x


output
----------------------------------------------------------------------------------------------------------------------------------------------------------
0x61200062 0x00 0x20


----------------------------------------------------------------------------------------------------------------------------------------------------------
0x61200062 a b



0x612062 0x00 0x20


----------------------------------------------------------------------------------------------------------------------------------------------------------
0x612062 a b



и еще:
select cast(CHAR(97)+CHAR(32)+CHAR(0)+CHAR(98) as varbinary(max))
select cast(REPLACE(CHAR(97)+CHAR(32)+CHAR(0)+CHAR(98), CHAR(32), '') as varbinary(max))
select cast(REPLACE(CHAR(97)+CHAR(32)+CHAR(0)+CHAR(98), CHAR(0), '') as varbinary(max))


output
0x61200062
-------------
0x610062
-------------
0x61200062
31 мар 15, 16:41    [17455350]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
felix_ff,
что где не заменяет/не удаляет, покажите мне еще раз

К сообщению приложен файл. Размер - 60Kb
31 мар 15, 17:01    [17455454]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
o-o
felix_ff,
что где не заменяет/не удаляет, покажите мне еще раз


К сообщению приложен файл. Размер - 130Kb
31 мар 15, 17:20    [17455566]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
felix_ff
invm
пропущено...
Переключите вывод студии в текстовый режим.


тт, что то я и запамятовал описание replace :(

https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
Символ 0x0000 (char(0)) не определен в параметрах сортировки Windows, и его нельзя включать в REPLACE
А так?
DECLARE @S VARCHAR(100)='12345'COLLATE Cyrillic_General_BIN+CHAR(0)+'67890';
SELECT @S, REPLACE(@S COLLATE Cyrillic_General_BIN,CHAR(0),'O');
Ваши страдания и пляски с VARBINARY(MAX) непонятны мне...
31 мар 15, 17:23    [17455582]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
felix_ff,

студии разные, ага?
меня 2008-ая еще не разу не подвела
Microsoft SQL Server Management Studio 10.50.6000.34

сейчас попробую в 2012-ой и 2014-ой,
а вы пока огласите точную версию своей
31 мар 15, 17:25    [17455592]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
не знаю, что у вас не то, у меня правильно показывает даже и в гриде,
даже в 2012-ой студии и на том же 2005 (у вас сервер 2005?)

К сообщению приложен файл. Размер - 65Kb
31 мар 15, 17:46    [17455700]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
o-o
felix_ff,

студии разные, ага?
меня 2008-ая еще не разу не подвела
Microsoft SQL Server Management Studio 10.50.6000.34

сейчас попробую в 2012-ой и 2014-ой,
а вы пока огласите точную версию своей


Что то это начинает взрывать мне мозг О_о

сервер 2005, студию пробую и 2008 и 2012 результат тот же.

А вот фишка с колейшн BIN прокатывает

файл раз:

К сообщению приложен файл. Размер - 126Kb
31 мар 15, 20:21    [17456196]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
файл 2:

К сообщению приложен файл. Размер - 147Kb
31 мар 15, 20:21    [17456200]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1451
DECLARE @x VARCHAR(1000)

SET @x = 'a b c d ef'

SET @x = REPLACE(REPLACE(REPLACE(@x COLLATE Cyrillic_General_BIN, ' ', ' '+CHAR(0)), CHAR(0)+' ', ''), CHAR(0), '')
SELECT CAST(@x as VARBINARY(MAX))

output
0x61206220632064206566


DECLARE @x VARCHAR(1000)

SET @x = 'a b c d ef'

SET @x = REPLACE(REPLACE(REPLACE(@x, ' ', ' '+CHAR(0)), CHAR(0)+' ', ''), CHAR(0), '')
SELECT CAST(@x as VARBINARY(MAX))

output
0x61000000006200000063000064006566


я так понимаю что тут дело или в параметре сортировки сервера/БД, или нехватает СП
не суть важно, просто для чистоты эксперимента удостоверился что лучше в такой комбинации использовать COLLATE
31 мар 15, 20:41    [17456262]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
felix_ff,

вы правы, все дело в *коллэйшене базы*.
но разница не в кириллическом/латинском,
а в виндовом/скульном.
на моих картинках базы имеют коллэйшен SQL_Latin1_General_CP1_CI_AS,
т.к. на работе он тянется со времен 2000-ого, если не раньше.
а на ноуте у меня виндовые коллэйшены, что кир. (Cyrillic_General_CI_AS), что лат. (Latin1_General_CI_AS), в них результат как у вас.
тогда завожу себе новую базу с SQL_Latin1_General_CP1_CI_AS и пожалуйста, все как на работе

К сообщению приложен файл. Размер - 22Kb
31 мар 15, 21:23    [17456408]     Ответить | Цитировать Сообщить модератору
 Re: Помогите распарсить строку  [new]
o-o
Guest
felix_ff,
слушайте, так ведь проблемы и вовсе нет.
вы свалили в 1 кучу 2 разных факта:

1. "у меня конкатенация с нулевым символом вырезает строку"
ответ: не вырезает, просто смотрите результат в виде текста, а не грида

2. "проблема не в замене какого то символа на CHAR(0), а именно удаления CHAR(0) из строки:
set @x = REPLACE(@x, CHAR(0), '')..."
и на это вы сами же и ответили, а мои тесты это же и подтвердили:
0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in REPLACE.
31 мар 15, 23:57    [17456823]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить