Как сделать запрос к таблице Postgresql с пробелами в Java - PullRequest
1 голос
/ 02 ноября 2019

Поэтому, когда я собираю пользовательский ввод и использую это значение в инструкции SELECT, он только читает последнюю строку после пробела. Так, например, если я ищу «Нью-Йорк», будет отображаться только «Йорк». Может быть, я могу сделать LIKE '%?', Затем сохранить все значения, возвращенные в массиве, и точно сопоставить введенные пользователем значения с именем города в массиве и вернуть его, но должен быть способ просто вернуть то, чтоя хочу из запроса.

Моя таблица:

   public void createTable(){
        try{
            Statement stmt = this.conn.createStatement();
            stmt.execute("CREATE TABLE IF NOT EXISTS Cities (" +
                    "name varchar(50)," +
                    "population int," +
                    "latitude double precision," +
                    "longitude double precision" +
                    ")");
            System.out.println("Cities table created.");
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }
    }

Вот моя функция, которая запрашивает

    public void readLine(String city){
        try{
            String sqlLike = "SELECT * FROM cities " +
                    "WHERE cities.name = ?";
            PreparedStatement ps = this.conn.prepareStatement(sqlLike);
            ps.setString(1, city);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                System.out.println();
                System.out.print(rs.getString(1));
                System.out.print(" " + rs.getString(2));
                System.out.print(" " + rs.getString(3));
                System.out.print(" " + rs.getString(4) + "\n");
            }
        }catch(Exception e){
            System.out.println(e);
        }

    }

Вот моя Главная, которая запрашивает ввод у пользователя. Пока нет подтверждения, так что не против, что

   public static void main(String[] args){
        Database dbConn = new Database();
        dbConn.createTable();
//        dbConn.insertIntoDatabase();
        Scanner scnr = new Scanner(System.in);
        String citySelect = "";

        while(!citySelect.equals("exit".toLowerCase())){
            System.out.print("Please enter the name of the city in question: ");
            citySelect = scnr.next();
            dbConn.readLine(citySelect.toLowerCase());
        }

    }

Любые ребята из Совета?

1 Ответ

1 голос
/ 02 ноября 2019

Проблема не в таблице базы данных или запросе, в которой не будет проблем с хранением или получением названий городов, содержащих пробелы.

Проблема в том, что класс Scanner по умолчанию использует пробелв качестве разделителя ( из класса 'Javadoc ):

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

Таким образом, каждый раз, когда вы вызываете сканер next (), вы получаете следующий строковый токен в соответствии с разделителем.

Чтобы изменить поведение по умолчанию, установите для сканера другой разделитель (возможно, такой, который не будетвстречаются в ваших результатах). Например, в своем коде перед циклом while вашего основного метода выполните следующий вызов:

scnr.useDelimiter(", ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...