🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

CAST 函数介绍
定义
CAST 函数可以让一个表达式从一种数据类型转换为另一种数据类型。
这在处理来自不同源的数据或需要满足特定数据类型要求的情况下就特别有用了!
语法规则
CAST (expression AS dataType);
参数解释
expression:指你想要转换的数据表达式或字段
dataType: 指定了你想要将表达式转换成的目标数据类型。
CAST函数支持的数据类型 包括但不限于如下:
数值类型 例如: INT, BIGINT, FLOAT, DECIMAL 等…
日期和时间类型 例如: DATE, TIME, DATETIME 等.
字符类型 例如: CHAR, VARCHAR, TEXT 等…
二进制类型例如: BINARY, VARBINARY 等…
…
举个栗子
SELECT CAST('重庆市' AS BINARY);
SELECT CAST(3.65 AS INT);
SELECT CAST('200' AS FLOAT);
SELECT CAST(100 AS BINARY);
SELECT CAST(0x000000000000000000000000000000000000000000000000000000000064 AS INT);
如图

应用场景
让我们来看一个更贴近实际应用的案例,这次我们将处理文本数据,并将其转换为不同的数据类型
举个栗子
假设我们有一个名为 CustomerContacts (客户联系方式表)
其中包含客户ID (CustomerID)、客户姓名 (CustomerName)、电话号码 (PhoneNumber),类型为 nvarchar
因为电话号码可能包含国家代码、区号、分隔符等这样的情况 对吧!
创建数据
CREATE TABLE CustomerContacts (
CustomerID int PRIMARY KEY,
CustomerName nvarchar(100),
PhoneNumber nvarchar(50)
);
INSERT INTO CustomerContacts (CustomerID, CustomerName, PhoneNumber) VALUES (1, '爱丽丝.史密斯', '+1(9)123-4567');
INSERT INTO CustomerContacts (CustomerID, CustomerName, PhoneNumber) VALUES (2, '鲍勃.约翰', '+1(8)888-8888');
INSERT INTO CustomerContacts (CustomerID, CustomerName, PhoneNumber) VALUES (3, '克莱尔', '+44(20)7946-0958');
如图

问题需求
那么问题来了,现在我们想要检查电话号码中是否包含特定的数字序列
比如: 检查是否包含数字9作为区号的一部分, 并且我们希望将这个数字转换为整数类型来进行比较,但是由于电话号码是文本字符串格式,所以我们需要先将其中的一部分转换为整数!
查询如下
SELECT
CustomerID,
CustomerName,
PhoneNumber,
CAST(SUBSTRING(PhoneNumber, CHARINDEX('(', PhoneNumber) + 1, CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) - 1) AS int) AS '查询结果'
FROM
CustomerContacts
WHERE
-- 这里我们添加一个条件来确保只处理包含区号的电话号码
PhoneNumber LIKE '%(%_%)%';
如图

我们先来分析一下这个SQL查询!~
首先我们的问题是用这个SQL查询来从一个包含电话号码的字符串中提取区号,并将这个区号转换为整数!
那么首先我们知道的是PhoneNumber是包含电话号码的字段, 我们假设这个字段中的电话号码格式类似于(123) 456-7890,其中区号就是被括号包围的地方!
使用CHARINDEX()函数
那么接下来我们先要提取它们~这里我们要用到一个CHARINDEX函数前面讲过它可以返回字符串中指定字符表达式的起始位置索引 但是注意: 这里的索引值从1开始
那么CHARINDEX('(', PhoneNumber) 这里就是查找左括号在PhoneNumber字段中第一次出现的位置!
比如
如果PhoneNumber是(123) 456-7890,则CHARINDEX('(', PhoneNumber)的结果将是1
同理, CHARINDEX(')', PhoneNumber) 这里查找右括号)在PhoneNumber字段中第一次出现的位置。
那么如果是(123) 456-7890, 那么CHARINDEX(')', PhoneNumber)的结果将是4
这样我们就先拿到了这左括号和右括号的索引了, 那有什么用呢? 这个时候就要使用到我们的SUBSTRING函数了
我们接着往下看~~
SUBSTRING函数前面我也说过,主要是用于从字符串中提取子字符串。
它的参数是:要从中提取子字符串的原始字符串、子字符串开始的起始位置,以及要提取字符数
那么这个时候,我们刚刚获取到的左括号和右括号的索引值就派上用场了!
我们现在单独把这一段代码拿出来看看
如下
SUBSTRING(PhoneNumber, CHARINDEX('(', PhoneNumber) + 1, CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) - 1)
首先从PhoneNumber中提取子字符串, 对吧,这个没问题!
然后从字符串的开始位置 也就是左括号之后的位置,也就是CHARINDEX('(', PhoneNumber) + 1
注意: 这里加1是要去掉左括号, 因为CHARINDEX('(', PhoneNumber) 的结果是1,而左括号 是字符串中的第一个字符,去掉它只需要加1就OK了!
接着是要提取的字符数, 我们可以从右括号位置减去我们的左括号位置, 再减去1进行获取!
所以写成了CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) - 1
先找到右括号的位置,然后减去左括号的位置 然后这里的减去1是因为要排除右边括号本身
例如 :
+44(20)7946-0958
那么这里右括号获取出来的结果应该是7, 而左括号获取出来的应该是4
这样得到了括号内所有字符的总位置差,包括括号本身, 最后再减去1
因为我们要排除括号本身,不算入区号的长度, 这样得到的结果就是区号中数字的实际长度!
那么总体来说如下:
求左边的开始位置就是: CHARINDEX('(', PhoneNumber) + 1 这个好理解吧!~ 去掉左边括号
求指定获取的长度就是: CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) - 1 去掉右边括号
理解了这个道理之后,其实你可以单独把这一段代码拿出来执行一下:
SELECT
SUBSTRING(PhoneNumber, CHARINDEX('(', PhoneNumber) + 1, CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) -1 ) as '提取区号' FROM
CustomerContacts
如图

最后把提取出来的结果用CAST函数把数据类型转换为INT类型就OK了!
SELECT
CAST(SUBSTRING(PhoneNumber, CHARINDEX('(', PhoneNumber) + 1, CHARINDEX(')', PhoneNumber) - CHARINDEX('(', PhoneNumber) -1 ) AS INT) as '提取区号' FROM
CustomerContacts
道理是一样的!



"👍点赞" "✍️评论" "收藏❤️"欢迎一起交流学习❤️❤️💛💛💚💚

好玩 好用 好看的干货教程可以点击下方关注❤️微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇


1004

被折叠的 条评论
为什么被折叠?



