将varchar转换为Integer进行计算

问题描述 投票:1回答:1

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

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

tsql ssms
1个回答
1
投票

除了架构问题,我们可以做到这一点,尽管性能可能会受到影响。我提供的示例从您的示例中假设坐标始终存储为由逗号(,)分隔的两个整数。

第一个示例利用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
© www.soinside.com 2019 - 2024. All rights reserved.