SQL Server中是否有LastIndexOf?

Ang*_*ker 42 sql sql-server sql-server-2016

我试图分析出从涉及获取一个字符串值最后一个 指标一个的字符串.目前,我正在做一个涉及反转字符串的可怕黑客攻击:

SELECT REVERSE(SUBSTRING(REVERSE(DB_NAME()), 1, 
    CHARINDEX('_', REVERSE(DB_NAME()), 1) - 1))
Run Code Online (Sandbox Code Playgroud)

对我来说,这段代码几乎是不可读的.我刚刚升级到SQL Server 2016,我希望有更好的方法.在那儿?

Gor*_*off 123

如果你想要最后一个之后的所有内容_,那么使用:

select right(db_name(), charindex('_', reverse(db_name()) + '_') - 1)
Run Code Online (Sandbox Code Playgroud)

如果你以前想要一切,那么使用left():

select left(db_name(), len(db_name()) - charindex('_', reverse(db_name()) + '_'))
Run Code Online (Sandbox Code Playgroud)

  • 我必须将第一个表达式更改为:`right(db_name(),charindex('_',reverse(db_name())+ '_')- 1)`才能使这项工作成功!否则很棒! (2认同)
  • 左边也应该有一个类似于右边的“-1”的偏移量。它应该是:`select left(db_name(), len(db_name()) - charindex('_', reverse(db_name()) + '_') + 1)`(我尝试编辑,但更改了至少 6 个字符。) (2认同)
  • ` + '_'` 部分是为了处理数据库名称中没有 _ 的情况吗? (2认同)

use*_*704 11

写了2个函数,1 为所选字符返回LastIndexOf.

CREATE FUNCTION dbo.LastIndexOf(@source nvarchar(80), @pattern char)
RETURNS int
BEGIN  
       RETURN (LEN(@source)) -  CHARINDEX(@pattern, REVERSE(@source)) 
END;  
GO
Run Code Online (Sandbox Code Playgroud)

和1在此LastIndexOf之前返回一个字符串.也许对某人有用.

CREATE FUNCTION dbo.StringBeforeLastIndex(@source nvarchar(80), @pattern char)
RETURNS nvarchar(80)
BEGIN  
       DECLARE @lastIndex int
       SET @lastIndex = (LEN(@source)) -  CHARINDEX(@pattern, REVERSE(@source)) 

     RETURN SUBSTRING(@source, 0, @lastindex + 1) 
     -- +1 because index starts at 0, but length at 1, so to get up to 11th index, we need LENGTH 11+1=12
END;  
GO
Run Code Online (Sandbox Code Playgroud)


Jua*_*eza 7

不,SQL 服务器没有 LastIndexOf。

这是可用的字符串函数

但是你总是可以创建自己的函数

CREATE FUNCTION dbo.LastIndexOf(@source text, @pattern char)  
RETURNS 
AS       
BEGIN  
    DECLARE @ret text;  
    SELECT into @ret
           REVERSE(SUBSTRING(REVERSE(@source), 1, 
           CHARINDEX(@pattern, REVERSE(@source), 1) - 1))
    RETURN @ret;  
END;  
GO 
Run Code Online (Sandbox Code Playgroud)


Chr*_*oph 5

CREATE FUNCTION dbo.LastIndexOf(@text NTEXT, @delimiter NTEXT)  
RETURNS INT
AS       
BEGIN  
  IF (@text IS NULL) RETURN NULL;
  IF (@delimiter IS NULL) RETURN NULL;
  DECLARE @Text2 AS NVARCHAR(MAX) = @text;
  DECLARE @Delimiter2 AS NVARCHAR(MAX) = @delimiter;
  DECLARE @Index AS INT = CHARINDEX(REVERSE(@Delimiter2), REVERSE(@Text2));
  IF (@Index < 1) RETURN 0;
  DECLARE @ContentLength AS INT = (LEN('|' + @Text2 + '|') - 2);
  DECLARE @DelimiterLength AS INT = (LEN('|' + @Delimiter2 + '|') - 2);
  DECLARE @Result AS INT = (@ContentLength - @Index - @DelimiterLength + 2);
  RETURN @Result;
END
Run Code Online (Sandbox Code Playgroud)
  • 允许使用多字符分隔符,例如“,”(逗号空格)。
  • 如果未找到分隔符,则返回 0。
  • 出于舒适原因,采用 NTEXT,因为 NVARCHAR(MAX) 被隐式转换为 NTEXT,但反之则不然。
  • 正确处理带有前导或尾随空格的分隔符!