2

我想从特定列中搜索一些关键字并打印与关键字对应的所有列值,现在问题是如果我使用查询

Select * from Candidate where %C% 等技能,技能中的不同行是:

Java、C、C++、HTML、CSS、Net Beans、我的 Eclipse

Java、Asp.Net、Eclipse

C、PHP、CSS、休眠

现在它正在显示所有行,因为 C 是每一行中的子字符串,我尝试使用 C% 而不是 %C% 但仅显示第 3 行,因为它以 C 开头,但我需要显示所有具有“C”的行作为一个不同的词,我如何搜索整个世界,建议一段代码。

import java.util.*;
import java.sql.*;
import java.io.*;

public class TokensOfString 
{
    public static void main(String[] args) 
    {
        String str;
        String query = "";
        try
        {
            int i =0, cntToken =0;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Enter the keywords to be searched");
            str = br.readLine();
            StringTokenizer words = new StringTokenizer(str, ",");
            cntToken = words.countTokens();
            //System.out.println("No. of Tokens = "+cntToken);

            String token[]= new String[cntToken];

            while(words.hasMoreElements())
            {
                token[i] = words.nextToken().trim();
                //System.out.println(token[i]);
                i++;
            }
                //System.out.println(++i+" : "+words.nextElement().toString().trim());    

            query = "SELECT * from can_skills where skills  like '"+ token[0] +"%'";
           // System.out.println("Query at 34 : "+query);
            if(cntToken == 1)
            {
                query ="";
                query = "SELECT * from can_skills where skills  like '"+ str +"%'";
            }
            if(cntToken > 1)
            {
                for( int j=1; j < cntToken; j++)
                query = query + " or skills  like '"+ token[j] +"%'";
            }
            System.out.println("Query at 43 : "+query);

            Connection con = null;
            Class.forName("com.mysql.jdbc.Driver");
            String hostName = "localhost";
            String port = "3306";
            String userName = "root";
            String password = "root";
            con = DriverManager.getConnection("jdbc:mysql://" + hostName + ":" + port + "/prem", userName, password);
            Statement statement= con.createStatement();
            ResultSet rs = statement.executeQuery(query);
            while(rs.next())
            {
                System.out.println(rs.getString(4));
            }

        }
        catch(ClassNotFoundException e){ System.out.println(e); }
        catch(Exception ex){ System.out.println(ex); }
    }
}
4

2 回答 2

0

你可以试试正则表达式:

"select * from can_skills where skills REGEXP '" . token . ",?'"

在这里阅读更多:http: //dev.mysql.com/doc/refman/5.1/en/regexp.html

FWIW:您现在拥有代码的方式使其容易受到注入式攻击。

于 2012-09-28T12:23:22.603 回答
0

使用正则表达式代替like表达式:

select *
from Candidate
where skills regexp '^C,| C,| C$'

|手段or。_ ^表示字符串的开始,表示$结束。所以它将匹配字符串开头、结尾和中间的标记。请注意,在第二种和第三种情况之前有空格。

在java中,如果我没有弄错:

"SELECT * from can_skills where skills regexp '^" + token[0] + ",| " + token[0] + ",| " + token[0] + "$'";
于 2012-09-28T12:25:46.957 回答