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

Откуда:
Сообщений: 6
Доброго времени!
Подскажете пожалуйста как решить следующий вопрос : есть таблица, в которой в одной ячейке указаны фамилия, имя и отчество.
Необходимо разнести ФИО на три столбца и вставить в другую таблицу,.
Как это можно реализовать на T-SQL?
12 апр 06, 12:14    [2551994]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
harun
Доброго времени!
Подскажете пожалуйста как решить следующий вопрос : есть таблица, в которой в одной ячейке указаны фамилия, имя и отчество.
Необходимо разнести ФИО на три столбца и вставить в другую таблицу,.
Как это можно реализовать на T-SQL?
PATINDEX()
12 апр 06, 12:15    [2552003]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35368
Блог
DECLARE @s varchar(120)
SET @s = 'Иванов Иван Иванович'

SELECT PARSENAME(REPLACE(@s,' ','.'), 1) AS [Фамилия],
       PARSENAME(REPLACE(@s,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(@s,' ','.'), 3) AS [Отчество]
Но если в ФИО 4 и больше пробелов, или оно состоит из 4-5 слов, то тут нет общего решения
12 апр 06, 12:51    [2552302]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
harun
Member

Откуда:
Сообщений: 6
Критик
DECLARE @s varchar(120)
SET @s = 'Иванов Иван Иванович'

SELECT PARSENAME(REPLACE(@s,' ','.'), 1) AS [Фамилия],
       PARSENAME(REPLACE(@s,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(@s,' ','.'), 3) AS [Отчество]
Но если в ФИО 4 и больше пробелов, или оно состоит из 4-5 слов, то тут нет общего решения


А не подскажете еще как сделать так, что бы за место 'Иванов Иван Иванович' можно было подтавить выборку, что то типа (SELECT fio FROM test). Если ее подставить , то выдаеться сообщение что результатов выборки больше чем 1, а, я так понимаю, что это локальная переменнай и у нее может быть только одно значение.
13 апр 06, 09:13    [2556403]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ну, дык...
SELECT PARSENAME(REPLACE(fio,' ','.'), 1) AS [Фамилия],
       PARSENAME(REPLACE(fio,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(fio,' ','.'), 3) AS [Отчество]
FROM test



Posted via ActualForum NNTP Server 1.3

13 апр 06, 09:16    [2556412]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
harun
Member

Откуда:
Сообщений: 6
ТОчно!.. Спасибо :-).. Совсем T-sql не знаю :-(
13 апр 06, 10:15    [2556656]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
Solovejs
Member

Откуда:
Сообщений: 29
Совсем ничего не понимаю.
DECLARE @s varchar(120)
SET @s = 'Иванов Иван Иванович'


SELECT PARSENAME(REPLACE(@s,' ','.'), 1) AS [Фамилия],
       PARSENAME(REPLACE(@s,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(@s,' ','.'), 3) AS [Отчество]
Выводит результат:
ФамилияИмяОтчество
ИвановичИванИванов

Что посоветуете проверить? Где копать?
23 май 11, 02:59    [10691971]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
Solovejs
Member

Откуда:
Сообщений: 29
Вопрос снят.
Этот запрос в принципе не верен.
А вот правильный
DECLARE @fio varchar(2000)
SET @fio = 'Иванов Иван Иванович'
SELECT substring(@fio, 1, charindex(' ', @fio)-1) AS Surname,
substring(@fio, charindex(' ', @fio)+1, charindex(' ', right(@fio,len(@fio)-charindex(' ', @fio)))-1) AS Firstname,
substring(right(@fio,len(@fio)-charindex(' ', @fio)), charindex(' ', right(@fio,len(@fio)-charindex(' ', @fio)))+1, len(@fio)) AS Patronymic
23 май 11, 03:24    [10691976]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Solovejs
Совсем ничего не понимаю.
DECLARE @s varchar(120)
SET @s = 'Иванов Иван Иванович'


SELECT PARSENAME(REPLACE(@s,' ','.'), 1) AS [Фамилия],
       PARSENAME(REPLACE(@s,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(@s,' ','.'), 3) AS [Отчество]
Выводит результат:
ФамилияИмяОтчество
ИвановичИванИванов

Что посоветуете проверить? Где копать?

А так
DECLARE @s varchar(120)
SET @s = 'Иванов Иван Иванович'


SELECT PARSENAME(REPLACE(@s,' ','.'), 3) AS [Фамилия],
       PARSENAME(REPLACE(@s,' ','.'), 2) AS [Имя],
       PARSENAME(REPLACE(@s,' ','.'), 1) AS [Отчество]
23 май 11, 07:01    [10692058]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Задачка как нельзя подходит для использования регекспов. Я бы сделал примерно вот так:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;

public class UdfRx
{
  [Microsoft.SqlServer.Server.SqlFunction]
  public static SqlString GetNamePart(string src, int pos)
  {
    if (pos < 0 || pos > 2) return null;
    var rx = new Regex(@"\s*(\w+)\s+(\w+)\s+(\w+)\s*", RegexOptions.Compiled);
    if (!rx.IsMatch(src) || rx.Matches(src)[0].Groups.Count < pos + 2) return null;
    return rx.Matches(src)[0].Groups[pos + 1].Value;
  }
};
потом
exec sp_configure 'clr enabled', 1
reconfigure
go
use stuff
go
create assembly UdfRx from 'C:\Projects\.Net\udf_rx\udf_rx\bin\Release\udf_rx.dll'
with permission_set = safe
go

create function udfrx_GetNamePart(@src nvarchar(4000),@pos int) returns nvarchar(4000)
as external name UdfRx.UdfRx.GetNamePart
go
и
use stuff
go
select '|'+s.[part]+'|' [part] from (
select [dbo].[udfrx_GetNamePart]('   Иванов          Иван Иванович',0) [part]
union all
select [dbo].[udfrx_GetNamePart]('   Иванов          Иван Иванович',1) [part]
union all
select [dbo].[udfrx_GetNamePart]('   Иванов          Иван Иванович',2) [part]
union all
select [dbo].[udfrx_GetNamePart]('   Иванов          Иван Иванович',3) [part]
) s
Результат:

part
1|Иванов|
2|Иван|
3|Иванович|
4|NULL|
23 май 11, 08:29    [10692154]     Ответить | Цитировать Сообщить модератору
 Re: Разделение данных ([ФИО] --> [Ф] [И] [О])  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Сон Веры Павловны,

эта "задачка" вообще ни для чего не подходит.
Ибо формат исходной строки не формализован,
а содержать фамилию, имя и отчество может в разном порядке.
(Я не обращаю внимания на название темы, а только на стартовый пост)
Кроме того, бывают очень сложные имена, состоящие из нескольких имён.
Если допускаются иностранцы, то и отчество у них может отсутствовать.
В пресловутой Исландии, наоборот, отчества есть, а фамилий нет.
И так далее...
23 май 11, 09:34    [10692340]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить