在字符串后选择下一个单词(SQL)

时间:2014-04-03 16:35:40

标签: sql sql-server database string tsql

我目前正在使用大型字符串数据集。我感谢SQL不适合字符串操作,但它是我唯一的选择。

我的原始表基本上采用'company name [+place name] [+ other text]'形式的字符串,并将其与地名列表进行匹配。如果匹配它,剥去地名并将其放在一个单独的列中,即

Daves butchers London | Daves butchers | London

除了那些格式为

的条目外,这适用于我的所有条目
Duke of Westminster | Duke of | Westminster

有没有办法查询一个表格,以便当第2列以'of'结尾时,我在第一列搜索第一列并将其插入第二列的末尾?

Duke of Westminster | Duke of Westminster | Westminster

特别是,通常情况是地名不在第1栏的末尾,即

Duke of Westminster 0177263774 | Duke of | Westminster

在这种情况下仍然可以吗?

我的数据集中有40,000,000行,我无法重建它 - 我只需要尝试解决问题。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'

答案 2 :(得分: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')

答案 3 :(得分:-2)

我认为在这里使用CASE声明是可行的方法 它已经解决here