Java 为SQL中的每个字母创建文件的最佳方法

Java 为SQL中的每个字母创建文件的最佳方法,java,sql,Java,Sql,我正在尝试为字母表中的每个字母+特殊字符创建一个xml文件,其中包含我编写的查询结果: Select * from people; (random example) 例如: hello_a.xml hello_b.xml hello_spec.xml 我已经完成了查询,它返回了当前的所有行。我只是想知道最好的方法。我是否要列出包含每个变量的字符串,并创建一个where table_列,如%?还是有更好的方法。现在我有了列表实现,但是我似乎找不到特殊字符的SQL部分 当我说特殊字符时,我指的是

我正在尝试为字母表中的每个字母+特殊字符创建一个xml文件,其中包含我编写的查询结果:

Select * from people; (random example)
例如:

hello_a.xml
hello_b.xml
hello_spec.xml
我已经完成了查询,它返回了当前的所有行。我只是想知道最好的方法。我是否要列出包含每个变量的字符串,并创建一个where table_列,如%?还是有更好的方法。现在我有了列表实现,但是我似乎找不到特殊字符的SQL部分

当我说特殊字符时,我指的是“&”、“%”或数值


编辑:使用JAXB将xml写入文件。

在我看来,不使用SQL来完成这一切会容易得多。使用您的查询并按名称排序(或使用的任何字段)。下面是一些psuedo代码,可以为您进行分组

records = SQL_RESUT;
specialCharResults = new List();
currentCharResults = new List();
currentChar = "A";
for (record : records) {
  if (record.name starts with special) {
    specialCharResults.add(record);
  } else {
    if (record.name does not starts with currentChar) {
      write out currentCharResults;
      currentCharResults = new List();
      currentChar = record.name first char;
    } else {
      currentCharResults.add(record);
    }
 }
 write out currentCharResults; //currentChar never changes away from "Z"
 write out specialCharResults;

还不完全清楚,所以我想您应该写下这个查询的结果:

SELECT * FROM people
按某列的第一个字符划分为27个单独的文件

以下不是Java,只是伪代码:

filenamePrefix = "hello_"
filenamePostfix = ".xml"

letters = "abc...xyz"

for letter in letters
   upper = Uppercase(letter)
   sqlquery = "SELECT * FROM people WHERE column LIKE '" + letter + "%' 
                                       OR column LIKE '" + upper  + "%' ;"
   results = runquery( sqlquery )
   filename = filenamePrefix + letter + filenamePostfix
   saveToFile( filename , results )

sqlquery = "SELECT * FROM people
            WHERE NOT REGEXP_LIKE(column, '^[[:alpha:]]', 'i') ;" 
                    /* 'i' stands for case Insensitive */ 
results = runquery( sqlquery )
filename = filenamePrefix + "spec" + filenamePostfix
saveToFile( filename , results )

您可以将查询更改为以下内容:

select substr(name, 1, 1) as alpha, * from people order by alpha
然后,您可以迭代结果集,并为结果集的
alpha
列中的每个新字符创建文件

这是Java中的示例代码,演示了该方法:

Statement s = connection.createStatement();
String q = "select substr(name, 1, 1) as alpha, * from people order by alpha"
ResultSet rs = st.executeQuery(q);

FileWriter fw = null;
char alpha = null;
while(rs.next()) {
    char newAlpha = rs.getString("alpha").charAt(0);
    if(newAlpha != alpha) {
        alpha = newAlpha;
        if(fw != null) {
            fw.close();
        }
        String fn = String.format("hello_%s.xml",
            Character.isLetterOrDigit(alpha) ? alpha : "spec");
        fw = new FileWriter(new File(fn));
    }
    //write record to open file writer
    //your JAXB code goes here
    //you should not iterate result set
}
fw.close();

请记住,代码尚未经过测试,因此可能无法立即运行或编译,但我希望它能够很好地解释这种方法。

1我忘记了一件事,我使用JAXB编写XML,我不确定这是否会改变我们的答案。然后我必须有27个我用来写XML的JAXB对象实例,我以前没有使用过JAXB,所以我不能直接解决它。但是,您不需要同时使用27个实例。一旦您写出A列表,您就不再需要对该列表的引用,它可以被垃圾收集。WHERE列不象“[A-z]”返回我表中的所有内容,而不仅仅是那些不以字母字符开头的内容。@RMT:您使用哪个数据库?我想
不象REGEXP_一样(列“^[:alpha:”)
适用于Oracle。@ypercube,我不明白,它会返回我的所有记录。对不起,正则表达式不是我的拿手好戏。我认为正确的答案是:
不像REGEXP_那样(列“^[:alpha:][]”)