从SQL创建每个Letter的文件的最佳方法

时间:2011-05-30 13:59:44

标签: java sql

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

Select * from people; (random example)

示例:

hello_a.xml
hello_b.xml
hello_spec.xml

我已完成查询,此时返回所有行。我只想知道最好的方法。我是否列出了包含每个变量的字符串,并执行where table_column LIKE A%?或者有更好的方法来做到这一点。现在我有List实现,但我似乎无法找到特殊字符的SQL部分。

当我说特殊字符时,我的意思是“&”,“%”或数值。

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

3 个答案:

答案 0 :(得分:3)

目前还不完全清楚所以我猜你想写下这个查询的结果:

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 )

答案 1 :(得分:2)

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

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();

请记住,代码尚未经过测试,因此可能无法正常工作或直接编译,但我希望它能很好地解释这种方法。

答案 2 :(得分:1)

我看到它的方式,不尝试使用SQL完成所有操作会容易得多。使用您拥有的查询并按名称(或您正在使用的任何字段)进行排序。这是一些伪造的代码,可以为你进行分组。

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;