Вот решение, которое работает для меня.
Первый шаг: Проблема была \ d в fn.matches () работает, но не работает в fn: replace (),Мне пришлось заменить \ d на [0-9].
SELECT COLUMN1 AS SOURCE, xmlcast(xmlquery(
'
if (not(fn:matches( $COLUMN1,"(^\d{0,10})#(\d{1,10})#(\d{1,10})$")))
then
xs:string($COLUMN1)
else
let $part1A := fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$1", "i")
let $part1B := fn:string-join(("0000000000", $part1A), "")
let $part1C := fn:substring($part1B, fn:string-length($part1B) - 9)
let $part2A := fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$2", "i")
let $part2B := fn:string-join(("0000000000", $part2A), "")
let $part2C := fn:substring($part2B, fn:string-length($part2B) - 9)
let $part3A := fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$3", "i")
let $part3B := fn:string-join(("0000000000", $part3A), "")
let $part3C := fn:substring($part3B, fn:string-length($part3B) - 9)
let $result := fn:string-join(($part1C, $part2C, $part3C), "")
return xs:string($result)
'
passing COLUMN1 AS "COLUMN1"
) AS VARCHAR(1020)) AS REPLACEDBY
FROM
TABLE(VALUES('123#456#789'),('test123#456#789data')) AS TABLE1(COLUMN1);
возвращает
SOURCE | REPLACEDBY
---------------------------------------------
123#456#789 | 000000012300000004560000000789
test123#456#789data | test123#456#789data
Второй шаг: Избегание процедурной логики приводит к
SELECT
COLUMN1 AS SOURCE,
RIGHT('000000000' || xmlcast(xmlquery('fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$1", "i")' passing COLUMN1 AS "COLUMN1") AS VARCHAR(10)), 10)
|| RIGHT('000000000' || xmlcast(xmlquery('fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$2", "i")' passing COLUMN1 AS "COLUMN1") AS VARCHAR(10)), 10)
|| RIGHT('000000000' || xmlcast(xmlquery('fn:replace($COLUMN1, "([0-9]{0,10})#([0-9]{1,10})#([0-9]{1,10})", "$3", "i")' passing COLUMN1 AS "COLUMN1") AS VARCHAR(10)), 10)
AS REPLACEDBY
FROM
TABLE(VALUES('123#456#789'),('test123#456#789data'),('0#0#0')) AS TABLE1(COLUMN1)
WHERE
0 <> xmlcast(xmlquery('fn:matches($COLUMN1,"(^\d{0,10})#(\d{1,10})#(\d{1,10})$")' passing COLUMN1 AS "COLUMN1") AS INTEGER);
возвращает
SOURCE | REPLACEDBY
---------------------------------------------
123#456#789 | 000000012300000004560000000789
0#0#0 | 000000000000000000000000000000