----VQ35 评论替换和去除
牛客有评论记录表comment_detail,输出字数大于3的评论的id,comment,且去除其中的中文逗号,查询返回结果名称和顺序为:
id|comment
表的创建及数据添加:
drop table if exists comment_detail;
create table comment_detail
(
id int,--'ID',
comment text,--'评论内容',
subject_set text,--'所属话题, 第一所属,第二所属, ....... 逗号分隔',
type_id int,--'被标记类型'
);
insert into comment_detail
values (1, '试一 下吧', '1001,1002,1003', 100);
insert into comment_detail
values (2, '是吗?', '10086,1002,10010', 101);
insert into comment_detail
values (3, '是的,真的啊!', '', 102);
insert into comment_detail
values (4, 'hello world', '11002,1002', 100);
insert into comment_detail
values (5, '你好,中国!', '11002,11024', 104);
insert into comment_detail
values (6, '天了噜,我表示不敢相信', '', null);
insert into comment_detail
values (7, '第一人2/3错误率, 第二人一定是1/2错误率, 相乘得1/3', '', 101);
insert into comment_detail
values (8, '看不懂。。。', '11022,1002', 102);
insert into comment_detail
values (9, '第2个括号里写错了,应该是(770 - (512-1))', '11022,1002', null);
insert into comment_detail
values (10, '大家猜猜我是谁', '142197,1002,143834', 104);
insert into comment_detail
values (11, '假设有 长度为2 那么 m= 2 ,f = 0 ,r = 1 那么计算结果应该是 2+1-0 mod 2 = 1', '11075', 100);
insert into comment_detail
values (12, '可以在线oj,( ^_^ )不错嘛', '11003', null);
insert into comment_detail
values (13, '年轻人可千万别努力错了方向啊~', '11002', null);
insert into comment_detail
values (14, '老师教过不会就选C,所以 应该是选择排序!', '', null);
insert into comment_detail
values (15, 'xxmmmxmx', '', null);
insert into comment_detail
values (16, 's*c/(a+b) ..', '11081', 100);
insert into comment_detail
values (17, '优点:该方法易于理解,缺点:实现过程太复杂了', '11002,1002,11004', 101);
insert into comment_detail
values (18, '求送书', '11002', 102);
insert into comment_detail
values (19, '我来看看', '11234,11007,11053', 100);
insert into comment_detail
values (20, '这个题目好难,求解答:)', '11022,11023', 101);
insert into comment_detail
values (21, '楼主好人~', '11022', 103);
insert into comment_detail
values (22, '我要报名 不过我名字的颜色是?', '', null);
查询如下:
select id,comment
from (
select id,
REPLACE(CAST(comment AS nvarchar(MAX)), ',', '') as comment,
LEN(REPLACE(CAST(comment AS nvarchar(MAX)), ',', '')) as str_len
from comment_detail) t
where str_len > 3
在上述查询中:
① CAST函数
在 SQL Server 中,CAST
函数用于将一个表达式转换为指定的数据类型。
语法:
CAST (expression AS data_type)
expression 是要转换的表达式,data_type 是要转换为的数据类型。
CAST(comment AS nvarchar(MAX))
查询中将 comment 列数据类型转换为nvarchar(MAX)
类型,如果无法转换,则会抛出错误。
CAST 函数支持的数据类型包括:
INT
:整数类型
FLOAT
:浮点数类型
VARCHAR
:可变长度字符型
DATETIME
:日期和时间类型
其他 SQL Server 支持的数据类型
需要注意的是,如果转换的表达式不符合目标数据类型的格式要求,会导致转换失败,进而抛出错误。因此,在使用 CAST 函数时,需要确保表达式可以正确转换为目标数据类型。
② REPLACE 函数
在 SQL Server 中,REPLACE
函数用于替换字符串中指定的字符或子字符串。
语法:
REPLACE (string_expression, search_expression, replacement_expression)
语法说明:
string_expression 是要进行替换操作的字符串表达式;
search_expression 是要被替换的字符或子字符串;
replacement_expression 是要替换的新字符或子字符串。
REPLACE(CAST(comment AS nvarchar(MAX)), ',', '') as comment
在查询中是将表comment列数据中的中文‘,’用‘’替换掉,即去除中文逗号,并将处理的结果列命名为comment
需要注意,REPLACE
函数区分大小写,替换操作是基于精确匹配进行的。如果要进行不区分大小写的替换操作,可以使用 COLLATE
子句指定不区分大小写的排序规则,或者使用LOWER或UPPER函数将字符串统一转换为小写或大写后进行替换。
③ LEN 函数
在 SQL Server 中,LEN
函数用于返回一个字符串表达式的长度(字符数)。
语法:
LEN (string_expression)
string_expression 是要计算长度的字符串表达式。
LEN(REPLACE(CAST(comment AS nvarchar(MAX)), ',', '')) as str_len
查询代码中将替换中文逗号后的列计算comment列的字符串长度
,并将结果命名为 str_len。
需要注意,LEN
函数计算的是字符串中的字符数,而不是字节数。对于 Unicode 字符(如中文字符),一个字符可能占用多个字节。如果需要根据字节数计算长度,可以使用 DATALENGTH
函数。
除了普通的字符串,LEN
函数还可以用于计算其他类型,如二进制数据或数字类型的长度。
对于字符串中的 NULL 值,LEN
函数返回 NULL。如果要将 NULL 值转换为空字符串,并返回 0 作为长度,请使用 ISNULL
函数或 COALESCE
函数来处理。例如:LEN(ISNULL(comment, ‘’))。
拓展:
此题问的是“字数”,包含中英文字符数;如果我们要查询评论中中文字符大于5的评论呢?
可以使用:LEN
和DATALENGTH
函数结合使用来查询一个中英文混合字符串中的中文字符个数。由于中文字符占用的存储空间是英文字符的两倍,我们可以通过计算字符串长度和字节数之间的差异来确定中文字符的个数。
【举个】鸡兔同笼问题,已知鸡兔的总腿数,假设让鸡子和兔子同时都抬起两条腿,那么剩下的腿子都是兔子的,可以得知兔子的个数。
【再举个】
--有一个字符串'你好SQL Sever你好World'
print LEN('你好SQL Sever你好World')
print DATALENGTH('你好SQL Sever你好World')
print DATALENGTH('你好SQL Sever你好World')-LEN('你好SQL Sever你好World')
执行结果:
18
22
4
中文字符的字节数是2,字符数是1;
英文字符的字节数是1,字符数是1。
DATALENGTH
函数获取字符串的字节数,然后使用LEN
函数获取字符串的字符个数,最后通过计算字节数与字符个数之差来确定中文字符的个数。