我目前正在使用大型字符串数据集。我感谢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行,我无法重建它 - 我只需要尝试解决问题。
答案 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