Regex в SQL Server, разделенные пробелами - PullRequest
0 голосов
/ 13 марта 2012

Мне было любопытно, возможно ли это в SQL

Вот моя таблица

Text
-----
India 01/01/2001 Mumbai
SriLanka 01/01/2001 Colombo
USA 01/01/2001 Chicago

Из этой таблицы создаются отдельные столбцы (разделенные пробелом), такие как

Country     Date        Location  
-----       -----       -------- 
India       01/01/2001   Mumbai
SriLanka    01/01/2001   Colombo
USA         01/01/2001   Chicago

Единственное, что меня здесь удивляет, это регулярное выражение, которое мы делаем в JAVA.

Это также возможно в SQL.

Спасибо !!!

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Вы можете разделить столбцы с помощью табличной функции, например:

CREATE FUNCTION [dbo].[fnParseFields] ( @str NVARCHAR(max), @delimiter NCHAR )
RETURNS @retval TABLE(Country NVARCHAR(max), [Date] NVARCHAR(max), Location NVARCHAR(max))
AS
BEGIN
    declare @f1 varchar(max), @f2 varchar(max), @f3 varchar(max);
    set @str=ltrim(@str);

    -- Field 1
    set @f1=(left(@str,CHARINDEX(@delimiter,@str,1)-1));
    SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(@delimiter,@str,1));

    -- Field 2
    set @f2=(left(@str,CHARINDEX(@delimiter,@str,1)-1));

    -- Field 3
    SET @f3=RIGHT(@str,LEN(@str)-CHARINDEX(@delimiter,@str,1));
    insert into @retval values (@f1,@f2,@f3);

    RETURN;
END

GO

create table myText (sometext varchar(80));

insert into myText values
('India 01/01/2001 Mumbai')
, ('SriLanka 01/01/2001 Colombo')
, ('USA 01/01/2001 Chicago');
go

select f.* from myText
cross apply [dbo].[fnParseFields](sometext,' ') f
go

Результат:

enter image description here

0 голосов
/ 13 марта 2012

На самом деле еще не пробовал, но можно импортировать файл значений, разделенных запятыми, используя T-SQL

BULK
INSERT tableName
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ' ',
ROWTERMINATOR = '\n'
)

Здесь является источником для образца.

Обновление Если данные хранятся в базе данных, кажется, что нет более простого решения, чем написать функцию / хранимую процедуру для анализа CSV, что-то вроде этого ответа SO предлагает.

...