2014-04-03 19 views
2

我目前正在處理大型數據集的字符串。我很欣賞SQL不適合字符串操作,但它是我唯一的選擇。選擇字符串後的下一個單詞(SQL)

我的原始表格基本上採用了形式爲'company name [+place name] [+ other text]'的字符串,並將其與地名列表進行匹配。如果有一個匹配它,剝去地名,並把它放在一個單獨的列即

Daves butchers London | Daves butchers | London 

也能正常工作對我的所有條目,除了那些形式

Duke of Westminster | Duke of | Westminster 

的有沒有查詢表格的方法,以便當第2列以''的單詞結尾時,我在第1列搜索後面的單詞並將其插入第2列的末尾?

Duke of Westminster | Duke of Westminster | Westminster 

特別是,它往往是那個地方的名字是不是在列1結束的情況下,即

Duke of Westminster 0177263774 | Duke of | Westminster 

是仍然有可能在這種情況下?

我的數據集中有40,000,000行,我不能重建它 - 我只需要嘗試解決這個問題。

+0

是否有任何多次出現的單詞? –

+0

有多少[duchies](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 

此假設您正在使用中第一次出現「的」從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 __Do你在這裏做什麼___結束AS [BP藥物治療] – 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') 
相關問題