2014-04-03 4 views
2

В настоящее время я работаю с большим набором данных. Я считаю, что SQL не идеален для манипуляции с строкой, но мой единственный вариант.Выберите следующее слово после строки (SQL)

Моя первоначальная таблица по существу взяла строку формы 'company name [+place name] [+ other text]' и сопоставила ее со списком мест. Если есть совпадение его, раздели название места и поместить его в отдельную колонку т.е.

Daves butchers London | Daves butchers | London 

Это прекрасно работает для всех моих записей, за исключением тех, которые имеют вид

Duke of Westminster | Duke of | Westminster 

Есть способ запроса таблицы, так что, когда столбец 2 заканчивается словом «из», я просматриваю столбец один для слова «после» и вставляем его в конец столбца 2?

Duke of Westminster | Duke of Westminster | Westminster 

В частности, это часто бывает, что название не в конце колонны 1, т.е.

Duke of Westminster 0177263774 | Duke of | Westminster 

Есть еще возможно в этом случае?

У меня в наборе данных 40 000 000 строк, и я не в состоянии его перестроить - мне просто нужно попытаться исправить проблему.

+0

есть ли с несколькими вхождениями слова? –

+0

Сколько [герцогов] (http://en.wikipedia.org/wiki/Duchies_in_England) для начала? Разве это не возможно просто обновить вручную всех герцогов и сделать с ними? –

ответ

1
select 'This is a test of concept with other words' as [Column1] 
    ,'This is a test of ' as [Column2] 
    Into #Tmp 

SELECT * 
,CASE WHEN RIGHT(RTRIM(Column2),3)=' of' 
THEN Column2+SubString(Column1, PATINDEX('% of %',Column1)+4, 
         CHARINDEX(' ' 
         ,Column1 
         ,(PATINDEX('% of %',Column1)+4) - PATINDEX('% of %',Column1)+4)) 
ELSE Column2 END 
FROM #tmp 

drop table #tmp 

это предполагает, что вы работаете с первым вхождением «OF» от Col1

+0

Я использовал этот ответ, но с частью длины подстроки (последний аргумент), заключенной в скобки несколько иначе: '(CHARINDEX ('', Column1, PATINDEX ('% of%', Column1) +4)) - (PATINDEX ('% от%', Column1) +4) ' –

-2

Я думаю, что использование оператора CASE, здесь есть путь
Он уже был решен here

+0

Я не уверен. Если вы считаете, что конструкция случая решит это, напишите код, который, по вашему мнению, будет работать. –

+0

Вы посмотрели ссылку, которую я предоставил? Это та же проблема, такой же путь разрешения. CASE WHEN '' + dbo.Table.Column + '' LIKE '% от%' THEN __do, что вы делали здесь, но ищите второе пространство вместо первого пространства__ ELSE __До том, что вы здесь делали >>> END AS [BP Medication ] – WickedFan

0

Вы можете сделать это:

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(rownum INT NOT NULL identity(1,1),splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

SELECT top 1 * FROM dbo.fnSplitString('Duke of Westminster',' ') 
WHERE rownum=2 AND splitdata='of' 
0

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

CREATE FUNCTION SplitInput 
( 
    @input NVARCHAR(MAX) 
) 
RETURNS @output TABLE(name NVARCHAR(MAX), place NVARCHAR(MAX)) 
BEGIN 
    DECLARE @index1 INT 
    DECLARE @index2 INT 

    SET @index1 = patindex('% of %', @input) 
    IF @index1 > 0 
    BEGIN 
     SET @index2 = patindex('% %', substring(@input, @index1 + 4, len(@input))) + @index1 + 3 
     IF @index2 > @index1 + 3 
      INSERT INTO 
       @output 
      VALUES 
       (left(@input, @index2 - 1), substring(@input, @index1 + 4, @index2 - @index1 - 4)) 
     ELSE 
      INSERT INTO 
       @output 
      VALUES 
       (@input, substring(@input, @index1 + 4, len(@input))) 
    END 
    RETURN 
END 

SELECT * FROM SplitInput('Duke of Westminster 12345') 
SELECT * FROM SplitInput('King of Scotland') 
Смежные вопросы