в SQL, как я могу удалить первые 3 символа слева и все справа после определенного символа - PullRequest
2 голосов
/ 12 июля 2019

В SQL как я могу удалить (из отображения в моем отчете не удаляя из базы данных) первые 3 символа (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, но я не знаю, как это сделать, не объявляя позицию, а имена и фамилии имеют разную длину, я действительно не знаю, как с этим справиться.

Заранее спасибо

Обновление: мне интересно, как использовать Locate для сопоставления позиции запятой, а затем передать ее в подстроку. Не уверен, что такой подход будет работать, и не уверен, как соединить синтаксис. Как вы думаете? это будет осуществимый подход?

Ответы [ 7 ]

2 голосов
/ 12 июля 2019

Вы можете попробовать это SUBSTRING(ColumnName, 4, CHARINDEX(',', ColumnName) - 4)

1 голос
/ 13 июля 2019

Db2 11.x для LUW:

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 голос
/ 12 июля 2019

В Postgres вы можете использовать split_part() при условии, что ни одно имя не содержит ,

select substr(split_part(the_column, ',', 1), 4)
from ...
0 голосов
/ 14 июля 2019

Если входная строка хорошо сформирована (то есть выглядит как ваши примеры данных без каких-либо дополнительных токенов, таких как пробел), вы можете использовать что-то вроде:

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

Если ваша версия Db2 поддерживает REGEXP, это лучший выбор.

0 голосов
/ 13 июля 2019

В моей версии DB2 для Z / OS CHARINDEX выдает синтаксическую ошибку. Вот два способа обойти это.

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

Я должен добавить, что версия V12R1

0 голосов
/ 12 июля 2019

Я думаю, что должен быть цикл, чтобы справиться с этим.Вот функция 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
0 голосов
/ 12 июля 2019

В Oracle 11g это может работать.

REGEXP_SUBSTR(REGEXP_SUBSTR(COLUMN_NAME,  '[^CN=]+',1,1),'[^,OU]+',1,1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...