在SQL中,如何删除特定字符后左侧的前3个字符和右侧的所有内容

时间:2019-07-12 02:29:41

标签: sql db2

在SQL中,如何删除前三个字符(CN =)以及逗号后面跟着“ OU”的所有内容(从报表上显示的内容,没有从数据库中删除的内容),这样我就剩下名称和最后一个名称在同一列中?例如:

CN=Tom Chess,OU=records,DC=1234564786_data for testing, 1234567
CN=Jack Bauer,OU=records,DC=1234564786_data for testing, 1234567
CN=John Snow,OU=records,DC=1234564786_data for testing, 1234567
CN=Anna Rodriguez,OU=records,DC=1234564786_data for testing, 1234567

所需显示:

Tom Chess
Jack Bauer
John Snow
Anna Rodriguez

我尝试过与TRIM一起玩,但是我不知道如何声明位置,并且姓名和姓氏的长度不同,我真的不知道该如何处理。

提前谢谢

更新:我想知道一种使用“定位”来匹配逗号位置,然后将其提供给子字符串的方法。不确定类似的方法是否可行,也不确定如何将语法组合在一起。你怎么看?这是可行的方法吗?

7 个答案:

答案 0 :(得分:2)

您可以尝试这个SUBSTRING(ColumnName, 4, CHARINDEX(',', ColumnName) - 4)

答案 1 :(得分:1)

在Postgres中,假设没有名称包含split_part(),您可以使用,

select substr(split_part(the_column, ',', 1), 4)
from ...

答案 2 :(得分:1)

LUW的Db2 11.x:

with tab (str) as (values
  '  CN  = Tom Chess  , OU = records,DC=1234564786_data for testing, 1234567'
, 'CN=Jack Bauer,OU=records,DC=1234564786_data for testing, 1234567'
, 'CN=John Snow,OU=records,DC=1234564786_data for testing, 1234567'
, 'CN=Anna Rodriguez,OU=records,DC=1234564786_data for testing, 1234567'
)
select REGEXP_REPLACE(str, '^\s*CN\s*=\s*(.*)\s*,\s*OU\s*=.*', '\1')
from tab;

请注意,这种正则表达式模式允许任意数量的空格,如上面示例的第1条记录中所示。

答案 3 :(得分:0)

在Oracle 11g中,它可能会起作用。

REGEXP_SUBSTR(REGEXP_SUBSTR(COLUMN_NAME,  '[^CN=]+',1,1),'[^,OU]+',1,1)

答案 4 :(得分:0)

我认为必须有一个循环来处理这个问题。这是SQL Server函数,它将对此进行解析。 (我知道这个问题并未指定SQL Server,但这是如何完成此操作的一个示例。)

select dbo.ScrubFieldValue(value) from table将返回您要查找的内容

CREATE FUNCTION ScrubFieldValue
(
    @Input varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @retval varchar(8000)
    DECLARE @charidx int
    DECLARE @remaining varchar(8000)
    DECLARE @current varchar(8000)
    DECLARE @currentLength int

    select @retval = ''
    select @remaining = @Input
    select @charidx = CHARINDEX('CN=', @remaining,2)

    while(LEN(@remaining) > 0)
    BEGIN
        --strip current row from remaining
        if (@charidx > 0)
        BEGIN
            select @current = SUBSTRING(@remaining, 1, @charidx - 1)
        END
        else
        BEGIN
            select @current = @remaining
        END
        select @currentLength = LEN(@current)
        -- get current name
        select @current = SUBSTRING(@current, 4, CHARINDEX(',OU', @current)-4)
        select @retval = @retval + @current + ' '
        -- strip off current from remaining
        select @remaining =substring(@remaining,@currentLength + 1,
            LEN(@remaining) -  @currentLength)
        select @charidx = CHARINDEX('CN=', @remaining,2)
    END
    RETURN @retval
END

答案 5 :(得分:0)

在我的DB2 Z / OS版CHARINDEX上抛出语法错误。解决此问题的方法有两种。

SUBSTRING(ColumnName, 4, INSTR(ColumnName,',',1) - 4)
SUBSTRING(ColumnName, 4, LOCATE_IN_STRING(ColumnName,',') - 4)

我应该补充一点,该版本为V12R1

答案 6 :(得分:0)

如果输入str的格式正确(即看起来像您的示例数据,没有任何其他标记,例如空格),则可以使用以下内容:

substr(str,locate('CN=', str)+length('CN='), locate(',', str)-length('CN=')-1)

如果您的Db2版本支持REGEXP,那是一个更好的选择。