el_tot93 Ответов: 2

Sql server как отделить полное имя


я не умею задавать вопросы

я хочу отделить полное имя ( A B C B E F ) во многих столбцах я использую этот код, чтобы сделать это


SELECT SUBSTRING(Name_Arabic, 1, CASE WHEN CHARINDEX(' ', Name_Arabic) = 0 THEN len(Name_Arabic) ELSE CHARINDEX(' ', Name_Arabic) END) name1,REPLACE(SUBSTRING(Name_Arabic, CASE WHEN CHARINDEX(' ',Name_Arabic) = 0 THEN len(Name_Arabic) ELSE CHARINDEX(' ', Name_Arabic) END + 1, LEN(Name_Arabic)), REVERSE(SUBSTRING(REVERSE(Name_Arabic), 1, CHARINDEX(' ', REVERSE(Name_Arabic)))), '') name2, 
                      REVERSE(SUBSTRING(REVERSE(Name_Arabic), 1, CHARINDEX(' ', REVERSE(Name_Arabic)))) name3
FROM            tabl DROP TABLE tabl


пример ( Ахмед Али Адхам Габер Шумер Ахмед )
и это дало мне ( колонна1 = Ахмед , колонна2= Али Адхам Габер Шумер, колонна3= Ахмед )

что я ищу является (столбец1= Ахмед , столбец2= Али , столбец3= Адхам , столбец_4= Габер ,column5= Шумер , column6= Ахмед)

как я могу это сделать

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

я искал об этом и ничего не нашел

Wendelius

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

el_tot93

я обновляю свой вопрос

Mohibur Rashid

Каково ваше максимальное количество столбцов? Что такое ваша схема таблицы, одна вещь заключается в том, что у вас не может быть динамической схемы таблицы. если вам нужен динамический формат таблицы то SQL не самое лучшее решение

el_tot93

максимальный столбец равен (15) ..
я просто хочу отделить полное имя

2 Ответов

Рейтинг:
2

RickZeeland

Вы также можете использовать "XML-подход", описанный здесь:
Определяемая пользователем функция SQL для анализа строки с разделителями[^]
По мнению автора, это кажется более эффективным.


Рейтинг:
18

Wendelius

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

Один из способов сделать это-создать пользовательскую функцию. Рассмотрим этот пример

CREATE FUNCTION CustomStringSplit(@value nvarchar(max), @delimiter nvarchar(max)) 
RETURNS @items TABLE (
   Ordinal	int,
   Part     nvarchar(max)
) AS 
BEGIN
   WITH Items (Ordinal, Part, Remainder) AS (
      SELECT 1 AS Ordinal,
			 CASE
                WHEN CHARINDEX(@delimiter, @value) > 0 THEN LEFT(@value, CHARINDEX(@delimiter, @value) - 1)
		        ELSE @value
		  END AS Part,
		  CASE
             WHEN CHARINDEX(@delimiter, @value) > 0 THEN SUBSTRING(@value, CHARINDEX(@delimiter, @value) + 1, 99999999)
		     ELSE NULL
		  END AS Remainder
      UNION ALL
	  SELECT Items.Ordinal + 1 AS Ordinal,
	         CASE
                WHEN CHARINDEX(@delimiter, Remainder) > 0 THEN LEFT(Remainder, CHARINDEX(@delimiter, Remainder) - 1)
		        ELSE Remainder
		     END AS Part,
		     CASE
                WHEN CHARINDEX(@delimiter, Remainder) > 0 THEN SUBSTRING(Remainder, CHARINDEX(@delimiter, Remainder) + 1, 99999999)
		        ELSE NULL
		     END AS Remainder
	   FROM Items
	   WHERE Items.Remainder IS NOT NULL
   )
   INSERT INTO @items (Ordinal, Part) 
      SELECT Items.Ordinal, Items.Part FROM Items;

   RETURN;
END;

После создания описанной выше функции вы можете попробовать использовать ее с помощью
DECLARE @name varchar(100);
SET @name = 'ahmed ali adham gaber sumer ahmed';

SELECT * FROM CustomStringSplit(@name, ' ');

В результате получается
Ordinal	Part
------- -----
1       ahmed
2       ali
3       adham
4       gaber
5       sumer
6       ahmed

Для того чтобы получить данные в виде столбцов вы можете попробовать например
DECLARE @name varchar(100);
SET @name = 'ahmed ali adham gaber sumer ahmed';
SELECT @name, 
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 1) AS Col1,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 2) AS Col2,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 3) AS Col3,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 4) AS Col4,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 5) AS Col5,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 6) AS Col6,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 7) AS Col7,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 8) AS Col8,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 9) AS Col9,
       (SELECT Part FROM CustomStringSplit(@name, ' ') WHERE Ordinal = 10) AS Col10

Результат должен быть таким
(No column name)	Col1	Col2	Col3	Col4	Col5	Col6	Col7	Col8	Col9	Col10
--------------------------------------------------------------------
ahmed ali adham gaber sumer ahmed	ahmed	ali	adham	gaber	sumer	ahmed	NULL	NULL	NULL	NULL

Если вы используете SQL Server 2016, вы также можете попробовать использовать STRING_SPLIT (Transact-SQL) - SQL Server | Microsoft Docs[^] вместо пользовательской функции.


el_tot93

мне очень жаль , что я новичок в sql, так что вы можете помочь мне с именами... table name = (tabl), col name = ( Name_Arabic)

Wendelius

Без проблем. Попробуйте что - нибудь вроде
Выберите Name_Arabic,
(Выбрать часть из CustomStringSplit(Name_Arabic, ''), где порядковый номер = 1) следующим образом: col1,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 2) как Col2,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 3) как Col3,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 4) как Col4,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 5) как Col5,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 6) как Col6,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 7) как Col7,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 8) как Col8,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 9) как Col9,
(Выберите деталь из CustomStringSplit(Name_Arabic, ' '), где порядковый номер = 10) как Col10
Из табл.