SQL-запрос на обновление данных

278
07 марта 2018, 07:10

В таблице четыре колонки id, name, description и price. Мне надо создать метод void changeDescription() который удаляет последнее предложение из description всех продуктов с длинной описания более 100. Метод я сделал до момента удаления последнего предложения.

private static void changeDescription(){
        try(Connection connection = DriverManager.getConnection(DB_URL, USER, PASS); Statement statement = connection.createStatement()) {
            String descriptionNew = "";
            try(ResultSet resultSet = statement.executeQuery("SELECT * FROM PRODUCT")){
                while (resultSet.next()){
                    String description = resultSet.getString(3);
                    if (description.length() > 100){
                        String[] arraySentences = description.split("[.]");
                        arraySentences[arraySentences.length - 1] = "";
                        for (String sentence : arraySentences){
                            if (sentence != null && !sentence.isEmpty()){
                                descriptionNew += sentence + ".";
                            }
                        }
                    }
                }
            }
            System.out.println(descriptionNew);
        }catch (SQLException e){
            System.err.println("Something went wrong");
            e.printStackTrace();
        }
    }

А вот дальше не знаю как сделать, чтобы обновились данные в таблице, в колонке Description. Как в запрос на обновление подставить descriptionNew?

Answer 1

Вообще сделать все в одном UPDATE довольно просто. Общая идея такая:

update product
   set description = case when instr(description, '.', -1, 2) = 0 then description 
                          else substr(description, 1, instr(description, '.', -1, 2)) end
 where length(description) > 100;

Выражение instr(description, '.', -1, 2) ищет вторую точку с конца. Если не находит (возвращает 0), то описание не изменяется, если находит - то далее берется подстрока с первого символа до этой точки. Тут, конечно, много допущений: что нет многоточий, сокращений, нет дат и чисел с точками-разделителями, точки стоят в конце каждого предложения и т. д. Но в общем виде задача поиска последнего предложения все равно не решаемая. Разве что нейросетями.

Вторая проблема с типом CLOB. Запрос выше хорошо будет работать только с varchar2, а с CLOB лучше использовать пакет DBMS_LOB. В нем есть точно такие же функции substr и instr.

READ ALSO
Java сортировка по количеству букв

Java сортировка по количеству букв

Всем приветЯ относительно недавно начал изучать Java

265
Получить значение рядом стоящего тега

Получить значение рядом стоящего тега

Всем привет есть такая верстка

225
Получить переменную из AJAX в php файл

Получить переменную из AJAX в php файл

ЗдравсвуйтеОбыскал весь интернет, ничего конкретного на мой вопрос не нашёл

235