字字珠玑的SQL如何言之凿凿?

上一篇文章我们大略介绍了在SQL中如何“绅士地“对待日期函数,今天就来讲讲对于文本数据的处理方式。

世界大同

相信处理过英文文本的朋友都知道大小写和空格的痛:

很多计算机语言在处理文本时不但要区分字母大小写,连一个小小的空格都不放过!

而今天,我们就先来看看如何一劳永逸地利用SQL解决检索时需要分辨大小写的问题:

upper(大写)将string(串)转换为大写:


UPPER('string')


lower(小写)将string(串)转换为小写:


LOWER('string')


string即为字符串,通常需要用单/双/三引号标注。具体使用哪种引号需具体问题具体分析,但很多情况下···

都是看心情【不

突然来介绍个在SQL中测试“新姿势”的小技巧:

使用SELECT语句。

大小写SELECT举例

虽然SELECT通常用来从表中检索数据,但通过省略FROM子句就可以简单地访问和处理表达式。来一起看个例子:


SELECT UPPER("i'm fine, thank you")
#注意在这里我使用了双引号,因为I'm中间有个单引号,为了避免混乱,故用了不同的引号。


sql server时间拼接时分秒_sql拼接当前日期


当然,这两个函数只适用于外文以解决大小写不统一的问题,对汉字是无效的:


SELECT UPPER("你好")


sql server时间拼接时分秒_sql server时间拼接时分秒_02


万宗归一

不过不必觉得沮丧,SQL的不少文本函数也是支持汉字的【其实是支持string(串)】,比如将几个字符串拼接在一起:

CONCAT

Concat(拼接),可以拼接串:


CONCAT(col_name, col_name)
#加入别的字符需要使用引号


简单的可以直接用SELECT语句测试:


SELECT CONCAT('我好饿', ',', '我想吃烤肉')


sql server时间拼接时分秒_子串_03


但为什么不来皮一下建个表呢~

建个表


CREATE TABLE 健身使人饥饿(状态 char(100), 想法 char(100));
INSERT INTO 健身使人饥饿 
VALUE('饿', '想吃'), ('很饿', '想吃肉'), ('非常饿', '什么都想吃'), ('已低血糖', '怕不是要去了');


sql server时间拼接时分秒_SQL_04


拼接举例


SELECT CONCAT(状态, ',', 想法)
FROM 健身使人饥饿
#注意我在两者之间加入了一个逗号。因为逗号在这里也是串的一部分,所以也要用引号区分。


sql server时间拼接时分秒_子串_05


除去拼接,我们还可以在当前的表格中进行对文本数据的选择。

LEFT

Left(左)返回串左边选定多少的字符串:


LEFT(string, number)


RIGHT

Right(右)返回串右边选定多少的字符串:


RIGHT(string, number)


LENGTH

Length(长度)返回串的字节长度:


LENGTH('string')


LOCATE

Locate(定位)找出串的一个子串。start(开始)是指开始搜索的位置,不是必填项,默认为


LOCATE(substring, string, start)


其中,substring为只想要检索的子串,string是原文本,start是位置(数字),留意空格也是算一个位置的。

这里还要啰嗦一句,SQL只会返回找到的第一个子串的位置,比如我们试图从“我是谁,我在哪儿,我要干什么?“中定位”我“。


SELECT LOCATE('我', '我是谁,我在哪儿,我要干什么?')


sql server时间拼接时分秒_子串_06


但如果我们从第四个位置开始搜索的话:


SELECT LOCATE('我', '我是谁,我在哪儿,我要干什么?', 4)


sql server时间拼接时分秒_sql server时间拼接时分秒_07


就变成第五个了。

LTRIM

Ltrim(左,修剪)去掉串左边的空格:


LTRIM('string')


RTRIM

Rtrim(右,修剪)去掉串右边的空格:


RTRIM('string')


SUBSTRING

Substring(子,串)返回子串的字符。这里,length(长度)指的是想要提取出来的字节长度,不是必填项:


SUBSTRING(string, start, length)


一鼓作气式举例

我们来看一下,根据刚才的表格“健身使人饥饿”,我们来如何:

  • 返回状态栏自左向右的前两位字符;
  • 测算想法栏的各项字节长度;
  • 返回想法栏从第二个字符开始的子串。
SELECT LEFT(状态, 2), LENGTH(想法), LOCATE('饿', 状态), SUBSTRING(想法, 2)
FROM 健身使人饥饿


sql server时间拼接时分秒_子串_08


大家可能会注意到,在计算想法栏的长度时,一个汉字算了三个字符长,遇到这个问题,我们可以用char_length(字符长度)来解决:

字符长度举例


SELECT CHAR_LENGTH('我是汉字')


sql server时间拼接时分秒_大小写_09


似是而非

最后再来啰嗦个···似乎又是只有英文才能用的函数。

SOUNDEX。

它可以将任何文本串转换为描述其语音表示的字母数字模式。SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对SOUNDEX的支持。

辨音举例

假如我们有这样一张表:


sql server时间拼接时分秒_SQL_10


此数据来源自网络。

再假如我并不确定"Y Lee"的发音,那么我就可以用似是而非的"Y Lie"来进行搜索:


SELECT cust_name, cust_contact
FROM customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Y Lie')


上述代码能匹配所有发音类似于Y.Lie的联系名:


sql server时间拼接时分秒_sql拼接当前日期_11


在这个例子中,WHERE子句使用Soundex()函数来转换cust_contact列值和搜索串为它们的SOUNDEX值。因为Y.Lee和 Y.Lie发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤出了所需的数据。

小结

来总结一下今天所学的文本函数:

  • Left( ) 返回串左边的字符
  • Right( ) 返回串右边的字符
  • Length( ) 返回串的长度
  • Locate( ) 找出串的一个子串
  • Lower( ) 将串转换为小写
  • Upper( ) 将串转换为大写
  • LTrim( ) 去掉串左边的字符
  • RTrim( ) 去掉串右边的字符
  • Soundex( ) 返回串的SOUNDEX值
  • SubString( ) 返回子串的字符

希望上文可以帮助大家对SQL的文本函数有个初步的了解,如果还是有什么疑问或是建议的话,欢迎留言询问~

祝各位学习愉快!