如何获取SQL子串?

smw*_*dia 1 sql t-sql sql-server substring

我有一个包含如下值的列:

"AAAA\BBBBBBBB\CCC"(A,B,C部分长度不固定.)

如果它存在,我需要修剪\ CCC部分,如果不存在则不管它.

例如:

AAA\BBBBBB\CCC - > AAA\BBBBBB

AA\BBBB - > AA\BBBB

AA - > AA

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

另外\ DDD\EEEE(等)也应该被删除

Cro*_*ono 7

虽然在纯T-SQL中肯定有办法实现它,但它可能不会那么清晰.

您可能需要考虑使用基于SQLCLR的用户定义函数(UDF).有了这些,您将能够从Sql Server中的(或)的强大功能和清晰度中受益.

只需使它成为您的函数将接收您的字符串作为参数并返回您想要的输出作为标量值.从那时起,您将能够像使用其他任何UDF一样使用该功能.这样,您的代码将更容易编写(以及之后的读取/维护).

您的函数可以像这样(伪代码)一样容易编写:

public static string SpecialSubstring(string input)
{
    if (input == null) return null;

    var builder = new StringBuilder();
    var occurences = 0;

    for (i = 0; i < input.Length; i++;)
    {
        var current = input[i];

        if (current == '\') occurences += 1;
        if (occurences >= 2) break;

        builder.Append(current)
    }

    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

然后,从T-SQL:

SELECT
    [owningschema].SpecialSubstring('AAA\BBBBBB\CCC'), -- returns 'AAA\BBBBBB'
    [owningschema].SpecialSubstring('AA\BBBB'),, -- returns 'AA\BBBB'
    [owningschema].SpecialSubstring('AA') -- returns 'AA'
Run Code Online (Sandbox Code Playgroud)

此页面将为您提供入门所需的全部内容:

SQL Server公共语言运行时集成

  • 这个.特别是如果它超过一次查询.(虽然如果它不止一次查询,请考虑更改底层数据结构.)对于所有字符串函数,TSql版本将非常昂贵. (3认同)
  • +1我以前创建了SQL CLR函数来公开.Net框架RegEx引擎的全部功能,因为SQL本身非常缺乏这样的东西. (2认同)