从sql server中的另一个字符串中获取字符仅字符串

时间:2014-10-22 11:01:20

标签: sql-server regex string

我正在寻找解决方案来获取从另一个字符串中提取的基于字符的字符串。 我只需要前4个字符和#34;从另一个字符串。 这里的限制是"另一个" string可以包含空格,特殊字符,数字等,可以少于4个字符。

例如 - 我应该

  1. " NAGP"如果源字符串是" Nagpur区"

  2. " ILLF"如果源字符串是"我是命中注定"

  3. " RAJU"如果源字符串是" RA123 * JU23"

  4. " MAC"如果源字符串是" MAC"

  5. 非常感谢任何帮助。

    感谢您分享您的时间和智慧。

3 个答案:

答案 0 :(得分:1)

^([a-zA-Z])[^a-zA-Z\n]*([a-zA-Z])?[^a-zA-Z\n]*([a-zA-Z])?[^a-zA-Z\n]*([a-zA-Z])?

你可以尝试这个。抓住捕获或组。参见演示。

http://regex101.com/r/rQ6mK9/42

答案 1 :(得分:1)

您可以使用问题中的答案并添加子字符串方法来获取所需长度的值 How to strip all non-alphabetic characters from string in SQL Server?

Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^a-z]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
End

一样使用它
Select SUBSTRING(dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl'), 1, 4);

这里SUBSTRING用于从返回值中获取长度为4的字符串。

答案 2 :(得分:0)

这里的派对有点晚了,但作为一般规则,我用BEGIN .. END鄙视所有功能,它们几乎从不表现良好,因为这涵盖了所有标量函数(直到Microsoft实现inline scalar expressions)因此,每当我看到一个我寻找提供类似可重用性的替代品时。在这种情况下,查询可以转换为内联表值函数:

CREATE FUNCTION dbo.RemoveNonAlphaCharactersTVF (@String NVARCHAR(1000), @Length INT)
RETURNS TABLE
AS
RETURN
(   WITH E1 (N) AS 
    (   SELECT 1 
        FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) n (N)
    ), 
    E2 (N) AS (SELECT 1 FROM E1 CROSS JOIN E1 AS E2), 
    N (Number) AS (SELECT TOP (LEN(@String)) ROW_NUMBER() OVER(ORDER BY E1.N) FROM E2 CROSS JOIN E1)
    SELECT  Result = (  SELECT  TOP (ISNULL(@Length, 1000)) SUBSTRING(@String, n.Number, 1)
                        FROM    N
                        WHERE   SUBSTRING(@String, n.Number, 1) LIKE '[a-Z]'
                        ORDER BY Number
                        FOR XML PATH('')
                    )
);

所有这一切都是使用数字列表将字符串扩展为列,例如RA123 *JU23T成为:

Letter
------
R
A
1
2
3

*
J
U
2
3
T

然后通过where子句删除不是字母数字的行:

WHERE   SUBSTRING(@String, n.Number, 1) LIKE '[a-Z]'

离开

Letter
------
R
A
J
U
T

@Length参数然后限制字符(在您的情况下这将是4),然后使用XML连接重建字符串。我通常会使用FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')进行xml连接以允许xml字符,但是因为我知道没有,所以我没有打扰,因为这是额外的开销。

使用1,000,000行的样本表对此进行一些测试:

CREATE TABLE dbo.T (String NVARCHAR(1000));
INSERT T (String)
SELECT TOP 1000000 t.String
FROM    (VALUES ('Nagpur District'), ('Ill Fated'), ('RA123 *JU23'), ('MAC')) t (String)
        CROSS JOIN sys.all_objects a
        CROSS JOIN sys.all_objects B
ORDER BY a.object_id;

然后比较标量和内联udfs(如下所示):

SELECT  COUNT(SUBSTRING(dbo.RemoveNonAlphaCharacters(t.String), 1, 4))
FROM    T;

SELECT  COUNT(tvf.Result)
FROM    T
        CROSS APPLY dbo.RemoveNonAlphaCharactersTVF (t.String, 4) AS tvf;

超过15次测试运行(可能不足以获得准确的数字,但足以绘制图片)标量UDF的平均执行时间为11.824秒,而内联TVF的平均执行时间为1.658,因此大约快85%。 / p>