我需要从地址字符串中提取城市。
下面的函数将帮助我使用空格作为分隔符来分割地址。
如果城市名称没有空格,则下面的代码有效,但如果城市名称中有空格,则无法工作
CREATE TABLE [dbo].[MyCity](
[ID] [int] IDENTITY(1,1) NOT NULL,
[City] [varchar](255) NULL,
[State] [varchar](2) NULL,
CONSTRAINT [PK_MyCity] PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[MyCity] ON
INSERT [dbo].[MyCity] ([ID], [City], [State]) VALUES (480, N'La Fayette', N'IL')
INSERT [dbo].[MyCity] ([ID], [City], [State]) VALUES (481, N'La Grange', N'IL')
INSERT [dbo].[MyCity] ([ID], [City], [State]) VALUES (482, N'La Harpe', N'IL')
INSERT [dbo].[MyCity] ([ID], [City], [State]) VALUES (483, N'East Saint Louis', N'IL')
INSERT [dbo].[MyCity] ([ID], [City], [State]) VALUES (484, N'Benton', N'IL')
SET IDENTITY_INSERT [dbo].[MyCity] OFF
CREATE FUNCTION [dbo].[ValueSplit](@RepParam nvarchar(4000), @Delim char(1)= ',')
RETURNS @VALUES TABLE (Param nvarchar(4000))AS
BEGIN
DECLARE @chrind INT
DECLARE @Piece nvarchar(4000)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim,@RepParam)
IF @chrind > 0
SELECT @Piece = LEFT(@RepParam,@chrind - 1)
ELSE
SELECT @Piece = @RepParam
INSERT @VALUES(Param) VALUES(@Piece)
SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
IF LEN(@RepParam) = 0 BREAK
END
RETURN
END
GO
DECLARE @Address AS NVARCHAR(255)
DECLARE @City AS NVARCHAR(255)
--Try the 4 addresses. Benton is a city name with no spaces and works.
SET @Address = '896872 STATE HIGHWAY 14 BENTON'
--'896872 STATE HIGHWAY 14 BENTON'
--'9 RR 10 *BOX 81 LA FAYETTE' --This city name cannot be found
--'642 N 60TH EAST SAINT LOUIS' --This city name cannot be found
--
-- Get City Works for Cities with No Spaces, but fails when the city has a space in the name
--
SELECT @City = City
FROM dbo.MyCity
WHERE City IN (
SELECT param
FROM dbo.ValueSplit(REPLACE(@Address,' ', ','), ',') )
SELECT @City
--
-- A look into the raw split
--
SELECT param
FROM dbo.ValueSplit(REPLACE(@Address, ' ', ','), ',')
例如,当使用以下地址时:9 RR 10 * BOX 81 LA FAYETTE
该功能将返回城市" La Fayette"在第6和第7位
东圣路易斯在第4,5和6位返回
如何将提供的字符串中的城市名称与城市表格相匹配?
答案 0 :(得分:2)
如果您只需要从字符串中提取城市名称,您可以选择城市名称作为以下
DECLARE @address VARCHAR(100) = '9 RR 10 *BOX 81 LA FAYETTE'
SELECT *
From MyCity
WHERE @Address LIKE '%'+City+'%'