T-SQL 子字符串 - 最后 3 个字符
Posted
技术标签:
【中文标题】T-SQL 子字符串 - 最后 3 个字符【英文标题】:T-SQL Substring - Last 3 Characters 【发布时间】:2011-12-02 16:53:17 【问题描述】:使用 T-SQL,我将如何获取 varchar 列的 最后 3 个字符?
所以列文本是 IDS_ENUM_Change_262147_190
我需要 190
【问题讨论】:
【参考方案1】:SELECT RIGHT(column, 3)
这就是你所需要的。
你也可以用同样的方法LEFT()
。
请记住,如果您在 WHERE
子句中使用它,RIGHT()
不能使用任何索引。
【讨论】:
如果您打算以这种方式搜索大量数据,那么有一种方法可以恢复索引的使用。创建一个计算列,该列是反向顺序的字符串。那么右边(最不重要)三个字符现在是左边(最重要)三个字符。然后索引该列并查找WHERE LEFT(reversed,3) = REVERSE('190')
。 (我很无聊,你能说吗?)【参考方案2】:
你可以使用任何一种方式:
SELECT RIGHT(RTRIM(columnName), 3)
或
SELECT SUBSTRING(columnName, LEN(columnName)-2, 3)
【讨论】:
一种方式比另一种方式有优势吗? RTRIM 是否必要(对我来说似乎是多余的)? 这项工作可以通过多种方式完成,这里我展示了使用常见的两种方式。第一种情况比第二种方法快。 RTRIM 不是强制性的。它仅用于省略右侧的任何额外空间。谢谢【参考方案3】:因为更多的思考方式总是好的:
select reverse(substring(reverse(columnName), 1, 3))
【讨论】:
不,更多并不总是更好。 你是对的。您将始终拥有完成任何工作所需的所有工具。我猜,知识不等于力量。 我不太确定这是什么意思。您提出的解决方案过于复杂,而且在任何情况下都不会是正确的解决方案。因此,它很糟糕。 欢迎来到软件开发的世界,“简单”并不总是可能的。如果你判断一个解决方案是否正确的标准之一是它是否复杂,那么你就错了。我是说鉴于所述问题我会使用此解决方案吗?不,我的意思是看到多种解决方案是有价值的,因为它拓宽了你对现有事物的视野。在此之前,也许 OP 不知道反向功能。现在她/他做到了。我对这里的否决票的看法是,它们应该保留用于明显不正确的解决方案。我的作品 对软件开发的本质和我在行业中明显缺乏资格的广泛宣扬与本论坛无关,因此我不打算在这里讨论它们。否决票表明答案在某种程度上是错误的或“坏的”。您的答案很糟糕,因为它不必要地很复杂;将两个或四个以上呼叫添加到reverse
的答案是否可以作为附加答案,因为它与您的答案不同?如果我加密和解密字符串呢?你是说任意无用的复杂性在某种程度上不是考虑因素。【参考方案4】:
declare @newdata varchar(30)
set @newdata='IDS_ENUM_Change_262147_190'
select REVERSE(substring(reverse(@newdata),0,charindex('_',reverse(@newdata))))
=== 解释===
我发现这样写更容易阅读:
SELECT
REVERSE( --4.
SUBSTRING( -- 3.
REVERSE(<field_name>),
0,
CHARINDEX( -- 2.
'<your char of choice>',
REVERSE(<field_name>) -- 1.
)
)
)
FROM
<table_name>
-
反转文本
查找第一次出现的特定字符(即第一次出现 FROM END 的文本)。获取此字符的索引
再次查看反转的文本。从索引 0 搜索到您的字符的索引。这给出了您正在寻找的字符串,但相反
反转反转的字符串以提供您想要的子字符串
【讨论】:
***.com cmets 可以接受通过简单标记(降价格式)进行的格式化。有可用的帮助。要显示代码段,您可以在每行前面加上四个空格。【参考方案5】:如果您想专门查找以所需字符结尾的字符串,那么这将对您有所帮助...
select * from tablename where col_name like '%190'
【讨论】:
这不能回答问题。 OP 想知道如何获取最后 3 个字符,无论它们是什么,而不是像 190 这样的特定字符串。以上是关于T-SQL 子字符串 - 最后 3 个字符的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 T-SQL 在数据库中的所有文本字段中搜索某些子字符串