Sql 您是为jOOQ开发还是使用JooqAPI?不管怎样,我很确定你可以使用JavaUDF…@Stobor:我是jOOQ的创建者。因此,我不希望创建对这个特定JDBC驱动程序的依赖。但是对于可能正在使用JooQAPI的人来说,您的解决方案仍然非常好。如果可以使用
Sql 您是为jOOQ开发还是使用JooqAPI?不管怎样,我很确定你可以使用JavaUDF…@Stobor:我是jOOQ的创建者。因此,我不希望创建对这个特定JDBC驱动程序的依赖。但是对于可能正在使用JooQAPI的人来说,您的解决方案仍然非常好。如果可以使用,sql,sqlite,emulation,padding,Sql,Sqlite,Emulation,Padding,您是为jOOQ开发还是使用JooqAPI?不管怎样,我很确定你可以使用JavaUDF…@Stobor:我是jOOQ的创建者。因此,我不希望创建对这个特定JDBC驱动程序的依赖。但是对于可能正在使用JooQAPI的人来说,您的解决方案仍然非常好。如果可以使用SQLite的pragmas发现这些UDF,那么jOOQ应该在本地支持它们!没问题!你的问题主要是促使我自己想办法做这件事。(我以前用Python做过,所以我怀疑这是可能的。)jOOQ看起来很有趣,祝你好运。很好,我不知道这是可能的!在我的特殊
您是为jOOQ开发还是使用JooqAPI?不管怎样,我很确定你可以使用JavaUDF…@Stobor:我是jOOQ的创建者。因此,我不希望创建对这个特定JDBC驱动程序的依赖。但是对于可能正在使用JooQAPI的人来说,您的解决方案仍然非常好。如果可以使用SQLite的pragmas发现这些UDF,那么jOOQ应该在本地支持它们!没问题!你的问题主要是促使我自己想办法做这件事。(我以前用Python做过,所以我怀疑这是可能的。)jOOQ看起来很有趣,祝你好运。很好,我不知道这是可能的!在我的特殊情况下,我不确定是否要创建依赖于此JDBC驱动程序功能的UDF。但总的来说,这是一个不错的选择solution@LukasEder:是的,它在多用途图书馆中稍微不太实用,但也有一些可能性。如果可以作为构建依赖项而不是运行时依赖项,那么您可以拥有一个特定于数据库的“初始值设定项”类,如果连接类字符串与“org.sqlite”或其他内容匹配,则可以(通过反射)加载该类。但是,是的,这不是唯一的方法,如果你有更好的方法,你总是可以用它们来代替。是的,这对填充固定长度的东西很有效。但是,即使这个固定长度是,比如说,
10
,这个解决方案也会变得冗长……这是一个优雅的解决方案,除了(我相信),在值的长度超过10的情况下……在这种情况下,额外的左侧字符会被截断。例如,SELECT SUBSTR('00000'| |'ABCDEFG',-5,5)
生成'CDEFG'。这可能是非常不需要的静默行为,只对零填充数字有用。不适用于字符串:选择printf(“%010s”,“8”)
→ <代码>'8'
SELECT
SUBSTR(
REPLACE(
CAST(ZEROBLOB(@padding_length) AS TEXT),
CAST(ZEROBLOB(1) AS TEXT),
@padding_char
) + @orig_text,
-@padding_length,
@paadding_length
)
SELECT
SUBSTR(
@orig_text + REPLACE(
CAST(ZEROBLOB(@padding_length) AS TEXT),
CAST(ZEROBLOB(1) AS TEXT),
@padding_char
),
1,
@padding_length
)
X = padToLength
Y = padString
Z = expression
select
Z ||
substr(
replace(
replace(
substr(
quote(zeroblob(((X - length(Z) - 1 + length(Y)) / length(Y) + 1) / 2)),
3
),
"'",
""
),
"0",
Y
),
1,
(X - length(Z))
)
sqlite> select "foo" || replace(replace(substr(quote(zeroblob((2 + 1) / 2)), 3, (2 - length("foo"))), "'", ""), "0", "W");
foo
sqlite> select "foo" || replace(replace(substr(quote(zeroblob((7 + 1) / 2)), 3, (7 - length("foo"))), "'", ""), "0", "W");
fooWWWW
import java.sql.*;
import org.sqlite.Function;
public class Test
{
public static void main(String[] args)
{
Connection conn = getConnection();
conn.createStatement().execute("SELECT LPAD(t.column, t.character, t.repeat) FROM t");
conn.createStatement().execute("SELECT RPAD(t.column, t.character, t.repeat) FROM t");
conn.close();
}
public static Connection getConnection()
{
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:");
/* Left Padding UDF */
Function.create(conn, "LPAD", new Function()
{
protected void xFunc() throws SQLException
{
String text = value_text(0);
/* uses first character of supplied padding */
char paddingCharacter = value_text(1).charAt(0);
int repeat = value_int(2);
int padLength = repeat - text.length();
if(padLength <= 0)
{
result(text);
}
char[] padding = new char[padLength];
Array.fill(padding, paddingCharacter);
result(new String(padding).append(text));
}
});
/* Right Padding UDF */
Function.create(conn, "RPAD", new Function()
{
protected void xFunc() throws SQLException
{
String text = value_text(0);
/* uses first character of supplied padding */
char paddingCharacter = value_text(1).charAt(0);
int repeat = value_int(2);
int padLength = repeat - text.length();
if(padLength <= 0)
{
result(text);
}
char[] padding = new char[padLength];
Array.fill(padding, paddingCharacter);
result(text.append(new String(padding)));
}
});
}
}
sqlite> select id,week,year from bulletin where id = 67;
67|2|2014
select id,CASE WHEN length(week) = 2 THEN week
ELSE '0'||week
END AS week,year from bulletin where id = 67;
67|02|2014
-- the statement below is almost the same as
-- select lpad(mycolumn,'0',10) from mytable
select substr('0000000000' || mycolumn, -10, 10) from mytable
-- the statement below is almost the same as
-- select rpad(mycolumn,'0',10) from mytable
select substr(mycolumn || '0000000000', 1, 10) from mytable
X = padToLength
Y = padString
Z = expression
select
Z ||
substr(
replace(
hex(zeroblob(X)),
'00',
Y
),
1,
X - length(Z)
);
CREATE TABLE subs_num (
subscriber_num integer PRIMARY KEY
);
INSERT INTO subs_num values ('1');
INSERT INTO subs_num values ('10');
INSERT INTO subs_num values ('100');
INSERT INTO subs_num values ('1000');
SELECT subscriber_num from subs_num;
SELECT SUBSTR('00000000' || subscriber_num, -8, 8) AS SUBSCRIB_ID FROM subs_num;
sqlite> SELECT PRINTF('%02d',5);
05
sqlite> SELECT PRINTF('%04d%02d',25,5);
002505
sqlite>