我有一个带有列的表。该列使用网格系统保存有关客户位置的信息。因此,我们的总部位于0,0
,并且客户以相同的方式存储距总部大约数英里的位置,例如-1,9
等。我正在使用数据类型Varchar
存储网格。
我一直在尝试编写查询以提取距总部不到5英里的位置数量。但是我似乎一直在获得相当随意的结果。我是否需要将网格转换为int并以某种方式删除逗号?还是我在做其他根本上是错误的事情。
答案 0 :(得分:1)
第一个示例利用PARSENAME
来拆分坐标以进行比较。 PARSENAME
并不仅仅是“ 5英里以内”的问题,但如果您想要更细化方向,那么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