【你也能从零基础学会网站开发】 我用通俗易懂的代码和案例给大家解释一下在SQL Server 2000中CAST函数是用来干嘛的,看不懂你来打我!

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

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

道理是一样的!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值