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

Откуда:
Сообщений: 55
Помогите пожалуйста, есть строка, например Иван Иванов, как проще всего вырезать и вывести второе слово?
16 апр 18, 09:14    [21341515]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24262
вбить название топика в поиск по форуму
16 апр 18, 09:35    [21341541]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Massa52
Member

Откуда:
Сообщений: 303
U_rtqwec,
Как вариант -
DECLARE @str NVARCHAR(100) = N'Иван Иванов'; 
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);
16 апр 18, 09:54    [21341579]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2235
Massa52
U_rtqwec,
Как вариант -
DECLARE @str NVARCHAR(100) = N'Иван Иванов'; 
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);


Но так в лоб не стоит использовать
16 апр 18, 10:25    [21341680]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
aleksrov
Member

Откуда:
Сообщений: 899
Massa52,

Ага, при Иван Васильевич мы получим "льевич"
16 апр 18, 10:26    [21341687]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 951
Вариант не фонтан, но пусть будет:
DECLARE @a NVARCHAR(100) = N'Иван Васильевич'
SELECT PARSENAME(REPLACE(@a, ' ', '.'), 1), PARSENAME(REPLACE(@a, ' ', '.'), 2)
16 апр 18, 10:48    [21341764]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Massa52
U_rtqwec,
Как вариант -
DECLARE @str NVARCHAR(100) = N'Иван Иванов'; 
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);

А если фамилия не Иванов? Сразу бы советовали
select right(@str,6)
16 апр 18, 11:01    [21341796]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2235
Дед-Папыхтет
Massa52
U_rtqwec,
Как вариант -
DECLARE @str NVARCHAR(100) = N'Иван Иванов'; 
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);

А если фамилия не Иванов? Сразу бы советовали
select right(@str,6)



даладно, и так хорошо, CHARINDEX дает позицию слева, если дает, а режем справа, считая, что позиция слева и есть количество


DECLARE @str NVARCHAR(100) = N'Иванидзе Петров Водкин';
SELECT CHARINDEX(N' ', @str)
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);

---
ров Водкин
16 апр 18, 11:13    [21341841]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Andy_OLAP
Member

Откуда: я знаю, что Зенит - чемпион
Сообщений: 2304
Ролг Хупин
Дед-Папыхтет
пропущено...

А если фамилия не Иванов? Сразу бы советовали
select right(@str,6)



даладно, и так хорошо, CHARINDEX дает позицию слева, если дает, а режем справа, считая, что позиция слева и есть количество


DECLARE @str NVARCHAR(100) = N'Иванидзе Петров Водкин';
SELECT CHARINDEX(N' ', @str)
SELECT RIGHT(@str, CHARINDEX(N' ', @str) + 1);

---
ров Водкин


Ну если у автора темы все слова разделяются ОДНИМ пробелом - таки легко и ненапряжно написать вполне кошерный код. Можно его обернуть в case when then else end, но мне лень.
DECLARE @str NVARCHAR(100) = N'Иванидзе Петров Водкин'; 
SELECT CHARINDEX(N' ', @str) -- первый пробел
SELECT substring(@str,CHARINDEX(N' ', @str)+1,len(@str)-CHARINDEX(N' ', @str)) -- все за первым пробелом
SELECT CHARINDEX(N' ', substring(@str,CHARINDEX(N' ', @str)+1,len(@str)-CHARINDEX(N' ', @str))) -- второй пробел
-- все между первым пробелом и вторым
select left(substring(@str,CHARINDEX(N' ', @str)+1,len(@str)-CHARINDEX(N' ', @str)),
len(substring(@str,CHARINDEX(N' ', @str)+1,len(@str)-CHARINDEX(N' ', @str)))
-CHARINDEX(N' ', substring(@str,CHARINDEX(N' ', @str)+1,len(@str)-CHARINDEX(N' ', @str)))
)
16 апр 18, 11:23    [21341886]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46331
DECLARE @str NVARCHAR(100) = N'Иванидзе Петров Водкин';
DECLARE @Delimiters NVARCHAR(100) = N'. ,;:';

SELECT LEFT(S,PATINDEX(N'%[^'+@Delimiters+N']['+@Delimiters+N']%',S+LEFT(@Delimiters,1)))
FROM (SELECT STUFF(@str,1,1+NULLIF(PATINDEX(N'%['+@Delimiters+N'][^'+@Delimiters+N']%',STUFF(@str,1,NULLIF(PATINDEX(N'%['+@Delimiters+N'][^'+@Delimiters+N']%',LEFT(@Delimiters,1)+@str),0),N'')),0),N'')) T(S);
16 апр 18, 12:17    [21342086]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
о! все меряются... тогда я тож :)
declare @str nvarchar(100) = N'Иванидзе    Петров   Водкин'
declare @t table (id int identity, name nvarchar(100))

insert @t (name)
select * from string_split(@str, ' ') where len(value) != 0

select * from @t where id = 2
16 апр 18, 13:34    [21342303]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2235
Дедушка
о! все меряются... тогда я тож :)
declare @str nvarchar(100) = N'Иванидзе    Петров   Водкин'
declare @t table (id int identity, name nvarchar(100))

insert @t (name)
select * from string_split(@str, ' ') where len(value) != 0

select * from @t where id = 2


Хмм, если 2016:
автор
string_split - SQL Server (starting with 2016)
16 апр 18, 13:55    [21342379]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1226
U_rtqwec
Помогите пожалуйста, есть строка, например Иван Иванов, как проще всего вырезать и вывести второе слово?


Дать по пальцам умнику, который такую структуру таблицы сотворил, забыв о НФ
16 апр 18, 13:57    [21342389]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Ролг Хупин
Хмм, если 2016:
откуда-то известно, что это не так?
16 апр 18, 14:00    [21342398]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1226
Дедушка
откуда-то известно, что это не так?

в моей 12ке не работает, к примеру
16 апр 18, 14:01    [21342407]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
шК0ДЕР
в моей 12ке не работает, к примеру
если вы не в курсе, что сия ф-ия только с 2016 это проблемы ваших знаний, а если ТС не указал версию сервера то это его проблемы (по дефолту считается самая распоследняя). :)
16 апр 18, 14:04    [21342421]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
шК0ДЕР
Member

Откуда: Издалека долго
Сообщений: 1226
Дедушка
шК0ДЕР
в моей 12ке не работает, к примеру
если вы не в курсе, что сия ф-ия только с 2016 это проблемы ваших знаний, а если ТС не указал версию сервера то это его проблемы (по дефолту считается самая распоследняя). :)


string_split - SQL Server (starting with 2016) вестимо...
16 апр 18, 14:06    [21342429]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46331
Дедушка,

а если разных разделителей много?

("А если б он вёз патроны?!" ©)
16 апр 18, 15:23    [21342691]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
felix_ff
Member

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

добавить разделителей по желанию :D
declare @str nvarchar(100) = N';LOL Иванидзе    Петров   Водкин'
select rtrim(try_convert(xml, '<r>' + replace(replace(@str, char(32), '</r><r>'), char(59), '</r><r>') + '</r>')
.query('for $x in (/r[position()>1 and data(.)>""]) return concat($x, " ")').value('.', 'varchar(255)'))

go
declare @str nvarchar(100) = N'LOL Иванидзе    Петров   Водкин'
select rtrim(try_convert(xml, '<r>' + replace(replace(@str, char(32), '</r><r>'), char(59), '</r><r>') + '</r>')
.query('for $x in (/r[position()>1 and data(.)>""]) return concat($x, " ")').value('.', 'varchar(255)'))


кстати хз что будет быстрее PATINDEX или xml
16 апр 18, 15:28    [21342722]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
iap
Member

Откуда: Москва
Сообщений: 46331
felix_ff
iap,

добавить разделителей по желанию :D
declare @str nvarchar(100) = N';LOL Иванидзе Петров Водкин'
select rtrim(try_convert(xml, '<r>' + replace(replace(@str, char(32), '</r><r>'), char(59), '</r><r>') + '</r>')
.query('for $x in (/r[position()>1 and data(.)>""]) return concat($x, " ")').value('.', 'varchar(255)'))

go
declare @str nvarchar(100) = N'LOL Иванидзе Петров Водкин'
select rtrim(try_convert(xml, '<r>' + replace(replace(@str, char(32), '</r><r>'), char(59), '</r><r>') + '</r>')
.query('for $x in (/r[position()>1 and data(.)>""]) return concat($x, " ")').value('.', 'varchar(255)'))



кстати хз что будет быстрее PATINDEX или xml
Точнее, на сколько наносекунд?
16 апр 18, 15:29    [21342725]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
felix_ff
Member

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

ну смотря в каких объемах сравнивать, думаю на (десяти-ста)-милионной таблице возможно разница будет.
16 апр 18, 15:31    [21342728]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2235
Дедушка
Ролг Хупин
Хмм, если 2016:
откуда-то известно, что это не так?


нескрепово
16 апр 18, 15:38    [21342764]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
iap
а если разных разделителей много?
а если пробел является и разделителем и частью "слова"?
смысл придумывать себе приключений на жо? есть постановка задачи...
+ хумор
— Слушай, ты разработчик. Ответь, почему разработчики всегда неправильно оценивают время на создание программ?
— Представь что тебе надо разгрузить машину, сколько времени это займет?
— Пару часов.
— Это камаз.
— 8 часов.
— Камаз, груженый песком.
— 12 часов.
— У тебя нет лопаты и инструментов, только твои руки.
— 2 дня.
— На улице минус 40.
— 4 дня.
— Камаз вообще под водой.
— Так же нечестно, ты постоянно придумываешь новые условия! К чему ты мне вообще все это рассказываешь? Вы, разработчики, вечно всякую фигню рассказываете! Вместо этого могли бы просто оценить правильное время на разработку.
16 апр 18, 15:42    [21342782]     Ответить | Цитировать Сообщить модератору
 Re: Вырезать второе слово из строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5319
правильно, сразу надо брать ТЗ на разбивку ФИО типа
Абу́ Али́ аль-Хаса́н ибн аль-Хаса́н ибн аль-Хайса́м аль-Басри́
16 апр 18, 15:48    [21342801]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить