在这篇文章中,我们将通过简单的例子来学习如何使用SQL LEFT函数。
什么是SQL LEFT函数?
在大多数情况下,我们需要在查询中处理字符数据类型,我们可以从SQL Server的内置字符串函数中受益。LEFT函数是内置的字符串函数之一,根据指定的字符数返回输入字符串的左边部分。现在我们将做一个非常基本的例子,然后我们将看一眼这个字符串函数的参数和其他细节。在下面的例子中,我们输入的字符串参数是**'SAVE THE GREEN'** ,我们想从左边提取前四个字符。
SELECT LEFT('SAVE THE GREEN',4) AS Result
正如我们所看到的,LEFT函数只接受两个参数,然后从左边返回字符串的前4个字符。
语法
LEFT函数的语法如下。
LEFT(string,number_of_characters)
参数
- string:希望被提取的字符串表达式
- number_of_characters:将从字符串左侧提取的字符数。这个数字必须是一个正的整数。
返回类型。
- 当字符串参数为非Unicode字符数据类型时,LEFT函数的返回类型为varchar
- 当字符串参数为Unicode字符数据类型时,LEFT函数的返回类型是nvarchar。
如何在表列中使用SQL LEFT函数
我们可以使用LEFT函数来提取一个表列的字符。下面的例子返回Person表的FirstName列的最左边的4个字符。
SELECT FirstName,LEFT(FirstName,3) AS NickName
FROM Person.Person
如何在字面字符串中使用SQL LEFT函数
字面字符串是用单引号或双引号括起来的字符表达式。例如,下面的LEFT函数将返回字符串表达式中最左边的5个字符。
SELECT LEFT('Peace will save the World',5) AS Result
如果number_of_characters超过了字符串参数的字符数,LEFT函数将返回所有字符串。例如'SAVE THE GREEN'表达式的字符数是14,当我们设置参数number_of_characters为15时,函数将返回整个字符串。
SELECT LEFT('SAVE THE GREEN',15) AS Result
现在,我们将尝试向LEFT函数传递一个负数。在这种情况下,该函数将返回一个错误。
SELECT LEFT('SAVE THE GREEN',-1) AS Result
如何用变量使用SQL LEFT函数
本地变量是用来保存指定数据类型的单一数值的。我们可以使用LEFT函数来提取分配给它们的值。下面的例子显示了LEFT函数与变量的用法。
DECLARE @Txt AS VARCHAR(100)
SET @Txt = 'Save Water Save Life'
SELECT LEFT('Save Water Save Life',4) AS Result
我们可以使用SELECT INTO语句将LEFT函数的结果插入到一个临时表中。
DECLARE @Txt AS VARCHAR(100)
DECLARE @UnicodeTxt NCHAR(100)
SET @Txt = 'Save Water Save Life'
SET @UnicodeTxt= N'Green Earth'
SELECT LEFT('Save Water Save Life',4) AS Result,
LEFT(@UnicodeTxt,5) AS ResultUnicode INTO
#TempList
SELECT * FROM #TempList
#TempList表的列数据类型将等于LEFT函数的返回类型。为了找到列的数据类型,我们可以使用 INFORMATION_SCHEMA.COLUMNS 视图。
正如上面所看到的,列的数据类型是参考变量数据类型自动生成的。
SQL LEFT函数和查询性能
SQL Server索引有助于提高查询的性能,但由于查询写得不好,但在某些情况下,由于查询写得不正确,查询优化器不能有效地使用索引。一般来说,最常见的错误是在where子句后使用标量函数。在这些情况下,SQL Server不能有效地使用索引,也不能生成一个最佳的查询计划。现在让我们考虑一下下面这个查询。这个查询从Person表中获取记录,其中FirstName列最左边的3个字符为 "Kim"。
SELECT FirstName,LEFT(FirstName,3) AS NickName
FROM Person.Person
WHERE LEFT(FirstName,3)='Kim'
当我们看这个查询的执行计划时,它执行了一个非群集的索引扫描操作。索引扫描操作者执行的是读取所有的索引页来找到符合条件的行。因此,数据引擎读取人表的全部记录,然后过滤符合where条件的行。这个过程不是一个有效的方法,会造成过多的资源消耗。
关于这个执行计划的另一个有趣的点是与计算标量运算符有关。这个操作符将LEFT函数转换为SUBSTRING函数。
现在,我们将改变我们的查询,删除LEFT函数,使用LIKE操作符。这种改变不会影响查询结果集。
SELECT FirstName,LEFT(FirstName,3) AS NickName
FROM Person.Person
WHERE 'Kim%'
在这个时候,优化器提出了一个索引建议,这个建议可以在执行计划中看到。
我们将创建索引并重新执行相同的查询。
CREATE NONCLUSTERED INDEX [NewTestIndex_FirstName]
ON [Person].[Person] ([FirstName])
在创建索引之后,涉及到LIKE操作符的查询会执行一个索引查找操作。这意味着它使用索引的B树结构快速找到合格的行。与索引扫描操作相比,索引搜索是最有效的操作。索引搜索比索引扫描操作更有效。
现在,我们将执行我们的第一个示例查询,在where子句后使用LEFT函数。
SELECT FirstName,LEFT(FirstName,3) AS NickName
FROM Person.Person
WHERE LEFT(FirstName,3)='Kim'
正如我们所看到的,由于查询中缺少LEFT函数的使用,该查询仍然执行了一个非聚类索引扫描。正如我们所学到的,我们可以在where子句后使用LIKE操作符而不是LEFT函数。
总结
在这篇文章中,我们已经学习了SQL LEFT函数的使用细节。这个函数有助于从左侧提取字符串。