SQL 2008R2 で、値 varchar、パターン varchar、セパレーター char、フィラーも char などのパラメーターを指定できる関数をプログラミングしています。次に、パターン「000.000.000.000」、セパレータ「.」で値「22687」を指定したいと思います。フィラーが「0」になると、関数が「000.000.022.687」を返すことを期待したいのですが、これを実行できる関数が既に実行されている人はいますか?
このようなもの:
DECLARE @valor VARCHAR(30)
DECLARE @formato VARCHAR(30)
DECLARE @separador CHAR(1)
DECLARE @rellenarcon CHAR(1)
SELECT @valor = '22959'
SELECT @formato = '000.000.000.000'
SELECT @separador = '.'
SELECT @rellenarcon = '0'
DECLARE @n INTEGER
DECLARE @m INTEGER
DECLARE @i INTEGER
DECLARE @j INTEGER
SELECT @n = LEN(@formato)
SELECT @m = LEN(@valor)
SELECT @i = 1
SELECT @j = 1
DECLARE @res2 varchar(30)
SELECT @res2 = ''
SELECT @valor = REVERSE(@valor)
WHILE @i<=@n
BEGIN
if SUBSTRING(@formato,@i,1) <> @separador
begin
IF @j<=@m
BEGIN
SELECT @res2 = @res2 + SUBSTRING(@valor,@j,1)
SELECT @i=@i+1
SELECT @j=@j+1
END
ELSE
BEGIN
SELECT @res2 = @res2 + @rellenarcon
SELECT @i=@i+1
END
end
else
BEGIN
SELECT @res2 = @res2 + @separador
SELECT @i=@i+1
END
END
print reverse(@res2)
Java から tsql へのクロスオーバー コードです。Java の元のコードは次のとおりです。
public static String formatear(String valor, String formato, char separator,
char fillWith, Map<Integer, String> params) {
int n = formato.length() - 1;
int m = valor.length() - 1;
int i = n;
int j = m;
StringBuilder res = new StringBuilder(formato);
for(; i >= 0; i--) {
if(res.charAt(i) != separator) {
if(j >= 0) {
res.deleteCharAt(i);
res.insert(i, valor.charAt(j--));
} else {
res.deleteCharAt(i);
res.insert(i, fillWith);
}
}
}
if(params != null) {
Set<Integer> keys = params.keySet();
for(Integer key : keys) {
i = key;
res.deleteCharAt(i);
res.insert(i, params.get(key));
}
}
return res.toString();
}