我有一个带有列的表。该列使用网格系统保存有关客户位置的信息。因此,我们的总部位于0,0
,我们的客户距离总部大约数英里的位置以相同的方式存储,例如-1,9
等我使用数据类型Varchar
来存储网格。
我一直在尝试编写一个查询来提取距离总部不到5英里的位置数量。但我似乎总是得到相当随意的结果。我是否需要将网格转换为int并以某种方式删除逗号?或者我在做其他根本错误的事情。
除了架构问题,我们可以做到这一点,尽管性能可能会受到影响。我提供的示例从您的示例中假设坐标始终存储为由逗号(,)分隔的两个整数。
第一个示例利用PARSENAME
来分割坐标以进行比较。仅仅在“5英里内”的问题上并不真正需要PARSENAME
,但如果你想要更精细的方向,那么PARSENAME
至少可以让你确定你的序数。
在第二个例子中,我使用STRING_SPLIT
来获得相同的结果。
(有一点需要注意,你说“位置小于5英里”,-5到5之间的位置也包括5英里的位置。
/* Build out the table */
CREATE TABLE Client
(
Client VARCHAR(100)
, Client_Location VARCHAR(12)
)
INSERT INTO dbo.Client
(
Client,
Client_Location
)
VALUES
('HQ','0,0')
,('Cust1','-1,9')
,('Cust2','7,11')
,('Cust3','-5,5')
,('Cust4','4,1')
,('Cust5','5,6')
,('Cust6','6,5')
/* Ex 1 */
SELECT
*
FROM dbo.Client
WHERE
CAST(PARSENAME(REPLACE(Client_Location,',','.'),2) AS int) BETWEEN -5 AND 5
AND CAST(PARSENAME(REPLACE(Client_Location,',','.'),1) AS int) BETWEEN -5 AND 5
/* Ex 2 */
SELECT
Client
, Client_Location
FROM dbo.Client
CROSS APPLY STRING_SPLIT(Client_Location,',')
WHERE
value BETWEEN -5 AND 5
GROUP BY Client, Client_Location
HAVING COUNT(client) = 2