2014-11-27 2 views
1

Прежде всего, я объясню мой случай использования:Эффективный способ сравнения входных данных с Sql таблицы в Java

Я получаю массив строк имен от пользователя (Can размера 2,5,1)

e.g Suppose user input is like this: 
String[] names={"Micheal", "Joe","Jim"} 

Теперь, после ввода ввода от пользователя, мне нужно нажать таблицу SQL, названную «ПОЛЬЗОВАТЕЛИ», и проверить, присутствуют ли все эти имена в таблице USERS или нет. Если какого-либо имени нет, верните значение false. Если все имена присутствуют в таблице USERS, верните значение true.

Моя идея:

Моя идея заключается в том, чтобы ударить таблицу ПОЛЬЗОВАТЕЛЕЙ. Получите все имена таблицы USERS в массиве String (названы как all_names), а затем сравните мою входную строку (имена i.e) с этой строкой all_names String. Поэтому, если имена являются подмножествами all_names, тогда верните true else return false.

Проблема:

Но я думаю, что это не является эффективным решением. Когда эта таблица будет расширяться, у меня будет тысячи записей, поэтому этот метод будет очень исчерпывающим. Любое другое лучшее и эффективное решение для этого, пожалуйста.

Обновлено Решение:

Пусть имена в таблице USERS являются уникальными.

Спасибо за ваши ответы. Теперь я принял этот подход, получив помощь от ваших ответов. Я хочу знать, что это решение лучше всего подходит или нет:

  String[] names={"Micheal","Jim","Joe"}; 


      String list2string = StringUtils.join(names, ", "); 
      //connection was established previosuly 
      stmt = conn.createStatement(); 
      System.out.println(list2string); 
      rs = stmt.executeQuery("SELECT COUNT(*) AS rowcount FROM USERS WHERE name IN (" + 
      list2string + 
      ")"); 

      rs.next(); 
      int count = rs.getInt("rowcount"); 
      rs.close(); 
      if(names.length==count){ 
       System.out.println("All names are in users table"); 
      }else{ 
       System.out.println("All names are not present in users table"); 
      } 

Хотите получить ваши комментарии к этому обновленному решению.

С уважением

+0

@atishshimpi Не можете понять ваш комментарий. Но что, если бы пользователь предоставил мне 100 имен? Так должен ли я запустить цикл 100 раз? Я думаю, это неэффективно. – Mr37037

+1

Всегда будут уникальные имена? – dosdebug

+0

@ Mr.777 Я выбрал имя в качестве примера здесь. Но атрибут, для которого я хотел получить решение, всегда останется уникальным в sql-таблице. – Mr37037

ответ

3

Вы правы, это не очень эффективно.

Это работа с базой данных, чтобы делать такие вещи.

Вы можете сделать инструкцию выбора для каждого имени, например.

SELECT name FROM users WHERE name = 'Micheal' 

или

SELECT name FROM users WHERE name IN ('Micheal', 'Joe', 'Jim') 

и проверить возвращенные строки.

В зависимости от того, какую инфраструктуру вы используете для запроса в базе данных, может быть тихо.

+0

«IN» вернет все те, что находятся. Скажем, Micheal там не будет, он не будет генерировать исключение и т. Д. OP попросил сопоставить все входы – dosdebug

+1

, если эти имена являются уникальными именами пользователей, отредактируйте sql для SELECT count (id) FROM users WHERE name IN ('Micheal', 'Joe', 'Jim'). то вам просто нужно проверить счетчик, если все существуют – user1519979

+0

Mr.777, поэтому я добавил «и проверил возвращенные строки». – jchampemont

1

Один из способов сделать это, может быть

SELECT 
    COUNT(DISTINCT name) 
FROM 
    users 
WHERE 
    name IN ('Micheal', 'Joe', 'Jim') 

Затем проверьте, если число равно можете подсчитать количество параметров, в нашем случае, мы должны получить 3.

+0

Это было бы отличным решением. –

1

Я получаю массив строк имен от пользователя (Can размера 2,5,1)

Вы получаете входной сигнал от пользователя, вы попали в базе данных с запросом:

SELECT (WHATEVER_YOU_NEED) FROM SCHEMA_NAME.TABLE_NAME WHERE COLUMN IN (USER_PROVIDED_INPUT);

Вы сохраняете этот результат в списке.

Получить все имена пользователей таблицы в массив String (названный как all_names) , а затем сравнить мою строку ввода (то есть имена) с этим all_names String. Поэтому, если имена являются подмножествами all_names, тогда верните true else return false.

Да, вы правы, так что вы будете использовать

Использование Collection.containsAll():

boolean isSubset = listA.containsAll(listB); 

И, если ваша база данных имеет уникальные имена (которые я думаю, может быть дубликатом), вы можете просто получите счетчик из SQL Query и сопоставьте его с пользовательским вводом.

Надеюсь, это поможет.

+0

Хотите получить комментарии на обновленное решение, пожалуйста, – Mr37037

0
SELECT IF(
    (SELECT COUNT(DISTINCT name) FROM users WHERE name IN ({toSearch})) = {Count}, 
    , 1 , 0 
) as Result 

заменить {toSearch}, например. 'Micheal', 'Joe', 'Jim' {count} - это число поисковых запросов в этом примере 3. поэтому, если все существуют, столбец «Результат» имеет значение 1 еще 0

+0

Хотите, чтобы ваши комментарии на обновленное решение, пожалуйста – Mr37037

2

вы можете сформировать строку из строкового массива с использованием цикла
например, если у вас есть строковый массив:
String [] names = {"Micheal", "Joe", "Jim"} Получить строку позволяет s -> "Micheal" , «Джо», «Джим»
Теперь запрос, как это:
Строка SQL = SELECT, имя из пользователей, где имя IN (»+ с +„)“(вы можете проверить формат)
получить коллекцию вывода.. и сравните с данным сборником.

Смежные вопросы