在Java中将输入数据与Sql表进行比较的有效方法

时间:2014-11-27 07:30:27

标签: java mysql

首先,我将解释我的用例:

我将从用户(Can of size 2,5,1)

获取一个字符串数组
e.g Suppose user input is like this: 
String[] names={"Micheal", "Joe","Jim"}

现在从用户那里获取输入后,我必须点击名为“USERS”的SQL表,并检查USERS表中是否存在所有这些名称。如果没有任何单个名称,则返回false。如果USERS表中存在所有名称,则返回true。

我的想法:

我的想法是打击USERS表。在String数组(名为all_names)中获取USERS表的所有名称,然后将我的输入字符串(即名称)与此all_names字符串进行比较。因此,如果names是all_names的子集,则返回true,否则返回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");
            }

希望您对此更新的解决方案发表意见。

此致

5 个答案:

答案 0 :(得分:3)

你是对的,这不是很有效。

执行此类操作是数据库工作。

您可以为每个名称制作一个select语句,例如。

SELECT name FROM users WHERE name = 'Micheal'

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

并检查返回的行。

根据您用于查询数据库的框架,它可能会有所不同。

答案 1 :(得分:2)

你可以使用循环来形成一个字符串数组 例如,如果你有这样的字符串数组:
String [] names = {“Micheal”,“Joe”,“Jim”} 得到一个字符串让我们说s - > “迈克尔”,“乔”,“吉姆” 现在查询如下:
String sql = SELECT name FROM users WHERE name IN(“+ s +”)“。(您可以检查格式)。
获取输出集合并与给定集合进行比较。

答案 2 :(得分:1)

一种方法,可以是

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

然后检查计数是否等于你的参数计数,在我们的例子中,我们应该得到3。

答案 3 :(得分:1)

  

我将从用户那里获得一个字符串数组(可以大小为2,5,1)

您从用户那里获得了输入,您使用查询命中数据库:

  

从SCHEMA_NAME.TABLE_NAME中选择(WHATEVER_YOU_NEED)WHERE COLUMN IN   (USER_PROVIDED_INPUT);

您将此结果存储在List中。

  

在String数组中获取USERS表的所有名称(名为all_names)   然后将我的输入字符串(即名称)与此all_names进行比较   串。因此,如果name是all_names的子集,则返回true   返回false。

是的,你是对的,所以你将使用

使用Collection.containsAll()

boolean isSubset = listA.containsAll(listB);

并且,如果您的数据库具有唯一的名称(我想这可能是重复的),您只需从SQL查询中获取计数并将其与用户输入匹配。

我希望这会有所帮助。

答案 4 :(得分: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