как разделить строку на разные столбцы?

У меня есть таблица с такими записями.

    MachineName
-----------------------

    Ab bb zecos
    a zeng
    zeng
    empty

4 строки в таблице.

Как я могу отделить эти 4 строки, чтобы получить вывод, как.

       M1       M2       M3
-----------------------------------
       Ab       bb      zecos
       a        zeng     NULL
       zeng     NULL     NULL
       NULL     NULL     NULL
 Brad Christie25 июн. 2012 г., 09:50
Это не случайно, так что вы можете применять теги к элементам, не так ли?
 user61497825 июн. 2012 г., 09:53
@BradChristie Не получил тебя!
 Brad Christie25 июн. 2012 г., 09:57
Как вы не поняли вопрос? Я спрашиваю, является ли ваша основная цель - применять теги к элементам (почти как в блоге к сообщениям), и теперь вы пытаетесь вернуть их обратно.
 MSUH25 июн. 2012 г., 10:44
Создайте временную таблицу со столбцами M1, M2, M3, получите имена компьютеров, разделите имена по пробелам и вставьте строку в новую таблицу
 ekholm25 июн. 2012 г., 10:39
Может быть, этот пост поможет:http://stackoverflow.com/questions/2647/split-string-in-sql

Ответы на вопрос(6)

DECLARE @Tmp TABLE (empid INT,joined nchar(10))

INSERT @Tmp SELECT 1,'1990, 1111' 
INSERT @Tmp SELECT 2,'2000, 2222' 

INSERT @Tmp SELECT 3,'1993, 3333' 

INSERT @Tmp SELECT 4,'1899, 4444' 
INSERT @Tmp SELECT 5,'1999, 5555' 

INSERT @Tmp SELECT 6,'2001, 6666 ' 


--Using PARSENAME 

SELECT empid, joined,
       PARSENAME(REPLACE(joined,',','.'),2) join1, 
       PARSENAME(REPLACE(joined,',','.'),1) join2 
FROM @Tmp
 15 февр. 2017 г., 12:33
Пожалуйста, объясните ваш код

#include <cstring>
#include <iomanip>

using namespace std;
int main () {
string machine[12];
for (int i = 0; i < 12; i++) {
    if (machine[i] == "")
        machine[i] = "NULL";
}

for (int i = 0; i < 3; i++) {
    cout << setw(10) << machine[i] << setw(10) << machine[i+1] << setw(10) << machine[i+2] << endl;
}
return 1;
}
 25 июн. 2012 г., 10:39
Звучит как ужасная история от TheDailyWTF для меня :)
 25 июн. 2012 г., 10:38
Выhonestly предложить решение запроса к базе данных путем извлеченияevery запись из БД, обработка ее в C ++, а затем отправка всех обратно в БД?Really?
 25 июн. 2012 г., 10:32
В этом сообщении нет тегов c ++, не правда ли?

with cte as(
    select 'Aria Karimi' as FullName
    Union
    select 'Joe Karimi' as FullName
    Union
    select 'Bab Karimi' as FullName
)

SELECT PARSENAME(REPLACE(FullName,' ','.'),2) as Name, PARSENAME(REPLACE(FullName,' ','.'),1) as Family from cte

Результат

Name    Family
-----   ------
Aria    Karimi
Bab     Karimi
Joe     Karimi

    CREATE FUNCTION [dbo].[SplitIndex](@Delimiter varchar(20) = ' ', @Search varchar(max), @index int)
    RETURNS varchar(max)
    AS
    BEGIN
          DECLARE @ix int,
                      @pos int,
                    @rt varchar(max)

          DECLARE @tb TABLE (Val varchar(max), id int identity(1,1))

          SET @ix = 1
          SET @pos = 1


          WHILE @ix <= LEN(@search) + 1 BEGIN

                SET @ix = CHARINDEX(@Delimiter, @Search, @ix)

                IF @ix = 0
                      SET @ix = LEN(@Search)
                ELSE
                      SET @ix = @ix - 1

                INSERT INTO @tb
                SELECT SUBSTRING(@Search, @pos, @ix - @pos + 1)

                SET @ix = @ix + 2
                SET @pos = @ix
          END

          SELECT @Rt = Val FROM @Tb WHERE id = @index
          RETURN @Rt     
    END

Используйте вот так:

SELECT dbo.SplitIndex(' ', 'hello World', 1)

Объедините это с ответом Демс, и вам будет хорошо идти

(Обратите внимание, что он вернет NULL, если указанный индекс не существует)

например

SELECT dbo.SplitIndex(' ', 'Hello World', 3)  

вернул бы NULL, потому что индекс 3 не существует

Хотя я не уверен, какова производительность, я просто изменил табличную функцию разбиения, которую я сделал, поэтому, возможно, стоит переписать ее, чтобы она была больше похожа на версию MySql.

Решение Вопроса

которая возвращает указанную часть объекта, которая разбрасывает строку, созданную. Please go through the ParseName ссылка, которая помогла мне в написании этого запроса

Declare @Sample Table
(MachineName varchar(max))

Insert into @Sample
values 
('Ab bb zecos'),('a Zeng')


  SELECT 
  Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 1)) As [M1]
 , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 2)) As [M2]
 , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 3)) As [M3]

  FROM  (Select MachineName from @Sample
  ) As [x] 
 25 июн. 2012 г., 10:59
Да, спасибо, что напомнили мне, но я думаю, что ОП упомянул в своем вопросе только 3 колонки
 25 июн. 2012 г., 10:54
Я вспоминаю кое-что о PARSENAME, не допускающем более 4 элементов (поскольку он используется для имен объектов, а 4 части - это максимальная длина идентификатора объекта) - так что вы можете использовать это, если вы помните это :)
 14 нояб. 2017 г., 09:58
идеально ... это то, что я тоже точно хочу .. спасибо за тонну :)

которые можно найти в любом хорошем поисковике ...

Большинство из них принимают одну строку и возвращают несколько строк, но вам нужно несколько столбцов. Таким образом, этот кажется подходящим:MySQL-сплит-строка-функция

Тогда вы просто делаете что-то вроде этого ...

SELECT
  SPLIT_STR(`machine name`, ' ', 1) AS M1,
  SPLIT_STR(`machine name`, ' ', 2) AS M2,
  SPLIT_STR(`machine name`, ' ', 3) AS M3
FROM
  `yourTable`

Ваш ответ на вопрос