Member 13288167 Ответов: 4

Разделить имя отчество и фамилию от полного имени из таблицы базы данных


eid ename
1   kula sekhar reddy
2   sachin ramesh tendulker
3   mahindra singh dhoni
4   ravi chandra aswin


Требуемый выход как ниже

eid   firstname  middlename   lastname
1      kula       sekhar       reddy
2      sachin     ramesh       tendulker
3       mahindra  singh        dhoni
4       ravi      chandra     aswin


Что я уже пробовал:

Пожалуйста, дайте запрос для отображения имен, как указано выше

Afzaal Ahmad Zeeshan

Мы понятия не имеем ни о таблице, ни о схеме, ни о чем другом. Как мы можем предоставить запрос на это?

PIEBALDconsult

Чтобы добавить к тому, что уже было сказано (избегайте манипуляций со строками в SQL), когда это необходимо, вы найдете лучшую производительность, написав табличнозначную функцию в C#.
https://www.codeproject.com/Articles/37377/SQL-Server-CLR-Functions
https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-functions/clr-table-valued-functions
https://technet.microsoft.com/en-us/library/ms131103(v=sql. 110). aspx

F-ES Sitecore

Важно, чтобы ваша база данных правильно моделировала ваши данные. Если имя, отчество и фамилия являются узнаваемыми сущностями в вашей системе, то они должны храниться как таковые. Поэтому храните каждый раздел в своем собственном поле и, если вы хотите показать их все вместе, объедините результаты в своем коде. Вы обнаружите, что сделать это таким образом гораздо проще, чем иметь одно поле, которое вы разделяете в SQL

4 Ответов

Рейтинг:
33
Рейтинг:
2

OriginalGriff

Это плохая идея: гораздо лучше обрабатывать ее в точке ввода данных, разделив ее затем и используя три столбца для хранения данных вместо одного (конкатенация тривиальна, но обработка строк SQL-это ... гм ... в лучшем случае примитивно.

Но это можно сделать: sql server-SQL: разбор имени, отчества и фамилии из поля fullname-переполнение стека[^]- это не красиво, это нелегко изменить, но это работает.

Понимаете, что я имею в виду, говоря, что это неправильный способ справиться с этим?


Рейтинг:
2

Kornfeld Eliyahu Peter

Это плохая идея хранить с самого начала имя в одном поле (если вам нужно, чтобы оно было разделено), так как SQL является слабым в манипулировании строками...
До SQL 2016 вообще не было встроенной функции разделения...
однако это возможно (но лучше заново нормализовать ваши данные)...
В 2016 году: STRING_SPLIT (Transact-SQL) | Microsoft Docs[^]
Pre 2016 (работает так же, как и версия 2016):

CREATE FUNCTION STRING_SPLIT (@STR NVARCHAR(MAX), @DEL NCHAR(1) = ' ')
RETURNS
	@RV TABLE (VALUE NVARCHAR (MAX))
AS
BEGIN

 DECLARE @PART NVARCHAR(MAX)
 DECLARE @POS INT

 WHILE CHARINDEX(@DEL, @STR) > 0
 BEGIN
  SELECT @POS  = CHARINDEX(@DEL, @STR)  
  SELECT @PART = SUBSTRING(@STR, 1, @POS - 1)

  INSERT INTO @RV 
  SELECT @PART

  SELECT @STR = SUBSTRING(@STR, @POS + 1, LEN(@STR) - @POS)
 END

 INSERT INTO @RV
 SELECT @STR

 RETURN
END


Рейтинг:
2

Maciej Los

Другой способ добиться этого - использовать CTE (Common Table Expressions) с Стержень[^]:

DECLARE @tmp TABLE(eid INT IDENTITY(1,1), ename VARCHAR(30))

INSERT INTO @tmp (ename)
VALUES('kula sekhar reddy'),
('sachin ramesh tendulker'),
('mahindra singh dhoni'),
('ravi chandra aswin')


;WITH CTE AS 
(
	--init query
	SELECT 1 AS MyCounter, eid, LEFT(ename, CHARINDEX(' ', ename)-1) AS PartOfName, RIGHT(ename, LEN(ename) - CHARINDEX(' ', ename)) AS Remainder
	FROM @tmp 
	WHERE CHARINDEX(' ', ename)>0
	UNION ALL
	--loop
	SELECT MyCounter + 1 AS MyCounter, eid, LEFT(Remainder, CHARINDEX(' ', Remainder)-1) AS PartOfName, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(' ', Remainder)) AS Remainder
	FROM CTE 
	WHERE CHARINDEX(' ', Remainder)>0
	UNION ALL
	--final
	SELECT MyCounter + 1 AS MyCounter, eid, Remainder AS PartOfName , NULL AS Remainder
	FROM CTE 
	WHERE CHARINDEX(' ', Remainder)=0
) 
SELECT eid, [1] AS FirstName, [2] As SecondName, [3] AS LastName
FROM (
	SELECT eid, MyCounter, PartOfName
	FROM CTE
	) AS dt 
PIVOT(MAX(PartOfName) FOR MyCounter IN ([1], [2], [3])) AS pvt


Результат:
eid	FirstName	SecondName	LastName
1	kula		sekhar		reddy
2	sachin		ramesh		tendulker
3	mahindra	singh		dhoni
4	ravi		chandra		aswin


Для получения более подробной информации, пожалуйста, смотрите:
Использование Общих Табличных Выражений[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]
С common_table_expression (Transact-SQL) | Microsoft Docs[^]