我有这个存储过程来查找英国邮政编码..
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_postcode_UK]
-- Add the parameters for the stored procedure here
@post_code varchar(10)
AS
DECLARE @intFlag INT
SET @intFlag = 4
WHILE (@intFlag >=1)
BEGIN
SET NOCOUNT ON;
SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS
where postcode = left(@post_code,@intFlag)
order by newid()
IF @@rowcount > 0
BREAK;
SET @intFlag = @intFlag - 1
END
GO
基本上我有一个主要区域及其地理位置的数据库..所以w140df的邮政编码将属于数据库中的w14 ...有时它会回到一个字母..我怎么做才这样存储过程不会返回前几次搜索的空白记录
答案 0 :(得分:7)
你可以这样做(假设你真的想要最长的匹配,因为它更精确):
SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS
where postcode IN (
left(@post_code,1), left(@post_code,2),
left(@post_code,3), left(@post_code,4)
)
ORDER BY LEN(postcode) DESC
无需循环。
你也可以使用,但我认为它会表现得更差。
SELECT top 1 id,lat,lng from [postcodes].[dbo].UKREGIONS
where @post_code LIKE postcode+'%'
ORDER BY LEN(postcode) DESC
请注意LIKE
子句中参数和列的反转顺序。