Лучший способ создать файл для каждой буквы из SQL

#java #sql

#java #sql

Вопрос:

Я пытаюсь создать XML-файл для каждой буквы алфавита специальные символы с результатами запроса, который я написал.:

 Select * from people; (random example)
  

пример:

 hello_a.xml
hello_b.xml
hello_spec.xml
  

Я выполнил запрос, который возвращает все строки на данный момент. Я просто хочу знать лучший способ сделать это. Должен ли я составить список строк, содержащих каждую переменную, и указать столбец where table_column, ПОДОБНЫЙ%? или есть лучший способ сделать это. Прямо сейчас у меня есть реализация списка, но, похоже, я не могу найти раздел SQL для специальных символов.

Когда я говорю специальные символы, я имею в виду «amp;», «%» или числовые значения.

Редактировать: Использование JAXB для записи xml в файл.

Ответ №1:

Это не совсем понятно, поэтому я просто предполагаю, что вы хотите записать результаты этого запроса:

 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. ГДЕ столбец, НЕ ПОХОЖИЙ НА ‘[a-z]%’, возвращает мне все в моей таблице, а не только те, которые не начинаются с алфавитных символов.

2. @RMT: Какую базу данных вы используете?

3. Я думаю, NOT REGEXP_LIKE(column, '^[:alpha:]') подойдет для Oracle.

4. @ypercube, я не понимаю, он возвращает все мои записи.

5. Извините, регулярные выражения — не мой конек. Я думаю, что правильный : NOT REGEXP_LIKE(column, '^[[:alpha:]]')

Ответ №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();
  

Имейте в виду, что код не был протестирован, поэтому может не сработать и не скомпилироваться сразу, но я надеюсь, что это достаточно хорошо объясняет подход.

Ответ №3:

На мой взгляд, было бы намного проще не пытаться делать все это с помощью 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;
  

Комментарии:

1. 1. я забыл указать, что я использую JAXB для записи в XML, я не уверен, изменит ли это ваш ответ вообще. Тогда у меня должно быть 27 экземпляров моего объекта JAXB, которые я использую для записи в XML.

2. Я раньше не использовал JAXB, поэтому не могу обратиться к нему напрямую. Но вам не нужны 27 экземпляров одновременно. Как только вы выпишете список A, вам больше не понадобится ссылка на этот список, и он может быть собран как мусор.