如何获取SQL子字符串?

如何获取SQL子字符串?,sql,sql-server,tsql,substring,c#,vb.net,sqlclr,Sql,Sql Server,Tsql,Substring,C#,Vb.net,Sqlclr,我有一列包含如下值: “AAAA\BBBB\CCC”(A、B、C零件长度不固定。) 我需要删除\CCC部分(如果存在),如果不存在,则将其保留 例如: AAA\BBBB\CCC->AAA\BBBBBB AA\BBBB->AA\BBBB AA->AA 对不起,我不太清楚,A、B、C部分不是字面上的ABC,它们可以是任何内容。 也应该删除\DDD\EEEE(等)虽然在纯T-SQL中肯定有一种方法可以做到这一点,但它可能没有那么清晰 您可能想考虑使用基于用户的自定义函数(UDF)来代替。这样,您就可以

我有一列包含如下值:

“AAAA\BBBB\CCC”(A、B、C零件长度不固定。)

我需要删除\CCC部分(如果存在),如果不存在,则将其保留

例如:

AAA\BBBB\CCC->AAA\BBBBBB

AA\BBBB->AA\BBBB

AA->AA

对不起,我不太清楚,A、B、C部分不是字面上的ABC,它们可以是任何内容。


也应该删除\DDD\EEEE(等)

虽然在纯T-SQL中肯定有一种方法可以做到这一点,但它可能没有那么清晰

您可能想考虑使用基于用户的自定义函数(UDF)来代替。这样,您就可以从Sql Server中(或)的强大功能和清晰性中获益

只需将其设置为函数将以参数形式接收字符串,并以标量值形式返回所需的输出。从那时起,您将能够像使用任何其他UDF一样使用该函数。这样,您的代码将更易于编写(以及以后的读取/维护)

您的函数可能很容易编写(伪代码):

本页将为您提供入门所需的基本信息:


如果有两个或多个零件(用\分隔),这里有一个解决方案,可以删除最后一个零件

您可以使用查找字段是否有3个(或更多)部分,然后进行一些字符串操作以切掉最后一部分:

select case 
       when PATINDEX(field, '%\%\%') > 0 then 
           /* Chop off last part */
           LEFT(field, len(field) - charindex('\', reverse(field)))
       else
           field
       end case as choppedfield
  from my_table

这就是我将如何完成这项任务:

declare @temp varchar(50), @temp2 varchar(15), @temp3 varchar(15)
set @temp = 'aaaa\bbbb\cccc\dddd'

IF (SELECT LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1))) != ''
    BEGIN
      SELECT LEFT(LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1)),LEN(LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1)))-1)
    END
ELSE
    BEGIN
      select @temp
    END

将其粘贴到查询窗口中,并使用不同的
@temp
值对其进行快照。它快速检查是否存在两个
'\'
s,并将其修剪到第二个
'\'
之前的字符位置。如果少于两个
“\”
s,它将只返回值本身。

您应该找到第三个斜杠,然后截断后面的文本。因此,您可以澄清一下:这是必须替换的第二个“\”后面的部分吗?或者与“\”的数量无关?是否有可能存在\DDD段?如果是的话,你想用它做什么?@Crono是的,可能是。我只想删除前两部分之后的部分。+1我过去创建了SQL CLR函数,以公开.Net framework正则表达式引擎的全部功能,因为SQL本身非常缺乏这些功能。@StevePettifer我也做了同样的事情。正确使用SQLCLR并用于正确的任务时,可以更轻松地执行某些操作。有时它甚至胜过T-SQL。特别是如果它不止是一次查询。(尽管如果它不止是一次查询,请考虑更改底层数据结构。)TSql版本对于所有字符串函数都非常昂贵。
DECLARE @var VARCHAR(32) = 'AAAA\BBBBBBBB\CCC'

SELECT
    LEN(@var) - LEN(REPLACE(@var, '\', '')) -- Number of occurences of the character \

    , CHARINDEX('\', @var) -- Position of the first occurence
    , LEN(@var) - CHARINDEX('\', REVERSE(@var)) -- Position of the last occurence

    , CASE WHEN LEN(@var) - LEN(REPLACE(@var, '\', '')) > 1 AND CHARINDEX('\', @var) !=  LEN(@var) - CHARINDEX('\', REVERSE(@var))
        THEN SUBSTRING(@var, 1, LEN(@var) - CHARINDEX('\', REVERSE(@var)))
        ELSE @var
    END
select case 
       when PATINDEX(field, '%\%\%') > 0 then 
           /* Chop off last part */
           LEFT(field, len(field) - charindex('\', reverse(field)))
       else
           field
       end case as choppedfield
  from my_table
declare @temp varchar(50), @temp2 varchar(15), @temp3 varchar(15)
set @temp = 'aaaa\bbbb\cccc\dddd'

IF (SELECT LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1))) != ''
    BEGIN
      SELECT LEFT(LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1)),LEN(LEFT(@temp,CHARINDEX('\',@temp, CHARINDEX('\',@temp,0)+1)))-1)
    END
ELSE
    BEGIN
      select @temp
    END