将varchar转换为Integer以进行计算

时间:2019-02-13 13:32:57

标签: tsql ssms

我有一个带有列的表。该列使用网格系统保存有关客户位置的信息。因此,我们的总部位于0,0,并且客户以相同的方式存储距总部大约数英里的位置,例如-1,9等。我正在使用数据类型Varchar存储网格。

我一直在尝试编写查询以提取距总部不到5英里的位置数量。但是我似乎一直在获得相当随意的结果。我是否需要将网格转换为int并以某种方式删除逗号?还是我在做其他根本上是错误的事情。

1 个答案:

答案 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