Как удалить CHR (0) из строк при использовании LISTAGG в БД Oracle? - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь запросить базу данных оракула и получить список имен в одной ячейке результата.

У меня есть запрос, подобный следующему, который производит имена в отдельных строках:

SELECT (lastname || ', ' || firstname) as fullname
FROM users
WHERE {some condition}

-- result --    
    fullname
Anderson, Alex
Baker, Bob
Clark, Carl

Однако, когда я пытаюсь использовать LISTAGG для объединения этих строк, я получаю следующую ошибку:

SELECT LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname) as instructors
FROM
(
    SELECT (lastname || ', ' || firstname) as fullname
    FROM users
    WHERE {some condition}
)

-- desired result --
    instructors
Anderson, Alex; Baker, Bob; Clark, Carl

-- actual result --
Error Type: System.Xml.XmlException
Error Message: hexadecimal value 0x00, is an invalid character. Line 1, position 32.

Обратите внимание, что если я использую LISTAGG для строки, составленной из конкатенации значений INT, запрос работаеткак и ожидалось:

SELECT LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname) as instructors
FROM
(
    SELECT (pk1 || ', ' || pk1) as fullname    -- pk1 is the users primary key
    FROM users
    WHERE {some condition}
)

-- result --
    instructors
01, 01; 02, 02; 03, 03

Я подозреваю, что проблема заключается в том, что поля имени и фамилии заканчиваются нулем, а LISTAGG неправильно удаляет пустые символы из результата.Я не уверен, как я могу удалить нулевые символы из результата внутреннего запроса.

Обратите внимание, что это база данных клиента, и мне не разрешено изменять ее содержимое.Мне нужно иметь возможность читать поля в их текущем формате и производить желаемый вывод.

1 Ответ

0 голосов
/ 31 октября 2018

У меня была такая же проблема.Решение для меня было:

SELECT replace(LISTAGG(fullname, '; ') WITHIN GROUP (ORDER BY fullname), chr(0)) as instructors 
...