Вопрос по sql, sql-server, sql-server-2008 – как разделить строку на разные столбцы?

4

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

    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
Может быть, этот пост поможет:http://stackoverflow.com/questions/2647/split-string-in-sql ekholm
Это не случайно, так что вы можете применять теги к элементам, не так ли? Brad Christie
Создайте временную таблицу со столбцами M1, M2, M3, получите имена компьютеров, разделите имена по пробелам и вставьте строку в новую таблицу MSUH
Как вы не поняли вопрос? Я спрашиваю, является ли ваша основная цель - применять теги к элементам (почти как в блоге к сообщениям), и теперь вы пытаетесь вернуть их обратно. Brad Christie
@BradChristie Не получил тебя! user614978

Ваш Ответ

6   ответов
8

которая возвращает указанную часть объекта, которая разбрасывает строку, созданную. 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] 
Да, спасибо, что напомнили мне, но я думаю, что ОП упомянул в своем вопросе только 3 колонки
Я вспоминаю кое-что о PARSENAME, не допускающем более 4 элементов (поскольку он используется для имен объектов, а 4 части - это максимальная длина идентификатора объекта) - так что вы можете использовать это, если вы помните это :)
идеально ... это то, что я тоже точно хочу .. спасибо за тонну :)
2
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
Пожалуйста, объясните ваш код
2

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
2

    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.

-4

#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;
}
В этом сообщении нет тегов c ++, не правда ли?
Выhonestly предложить решение запроса к базе данных путем извлеченияevery запись из БД, обработка ее в C ++, а затем отправка всех обратно в БД?Really?
Звучит как ужасная история от TheDailyWTF для меня :)
0

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

Большинство из них принимают одну строку и возвращают несколько строк, но вам нужно несколько столбцов. Таким образом, этот кажется подходящим: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`

Похожие вопросы