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>