#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, вам больше не понадобится ссылка на этот список, и он может быть собран как мусор.