【问题标题】:How to get tablename,column names and column values seperatly from string如何从字符串中分别获取表名、列名和列值
【发布时间】:2016-05-31 16:49:33
【问题描述】:

我有下面这样的字符串

 String stat="INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";

如何从字符串中分别获取表名、列名和值

【问题讨论】:

  • 这个问题很不清楚。
  • 您的意思是说您要从该字符串中提取表名、列名和值?
  • 我认为从OP想要从提供的字符串中提取表名、列名和值的问题中很清楚。不是吗?

标签: java arrays string stringbuilder stringbuffer


【解决方案1】:

假设您的 stat 字符串格式相同,您可以这样做:

public static void main (String[] args) 
{
    String stat = "INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";
    System.out.println("Table Name: " + stat.substring(stat.indexOf("INSERT INTO ") + 12,stat.indexOf("(")));
    System.out.println("Column Names: " + stat.substring(stat.indexOf("(") + 1,stat.indexOf(")")));
    System.out.println("Column Values: " + stat.substring(stat.indexOf("VALUES (") + 8,stat.lastIndexOf(")")));
}

输出:

Table Name: DEPARTMENT
Column Names: DNO, NAME, TEST_ID
Column Values: 2, 'ADM', 1

准备更新语句可能有点棘手,因为您必须注意是设置varchar 还是int 并根据数据类型进行更改。例如,您将始终将 varchar 数据括在单引号中。

以下是有关如何准备更新声明的说明:

public static void main (String[] args) 
{
    String stat = "INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";
    String tableName = stat.substring(stat.indexOf("INSERT INTO ") + 12,stat.indexOf("("));
    String columnNames = stat.substring(stat.indexOf("(") + 1,stat.indexOf(")"));
    String columnValues = stat.substring(stat.indexOf("VALUES (") + 8,stat.lastIndexOf(")"));

    /* Prepare New Values Object */
    Object[] newValues = new Object[3];
    newValues[0] = new Integer(1);
    newValues[1] = new String("foo");
    newValues[2] = new Integer(8);

    /* Extract Column Names & Appen New Values */
    StringBuilder sb = new StringBuilder();
    sb.append("UPDATE " + tableName + " SET ");
    String[] splits = columnNames.split(", ");
    for(int i = 0; i < splits.length; i++) {
        sb.append(newValues[i] instanceof String ? splits[i] + " = '" + newValues[i] + "', " : splits[i] + " = " + newValues[i] + ", ");
    }
    String newString = sb.substring(0, sb.length() - 2);

    /* Extract Old Values & Prepare Where Caluse */
    sb = new StringBuilder();
    sb.append(" WHERE ");
    String[] splitz = columnValues.split(", ");
    for(int i = 0; i < splits.length; i++) {
        sb.append(splits[i] + " = " + splitz[i] + " AND ");
    }
    String where = sb.substring(0, sb.length() - 5);

    /* Print Result */
    System.out.println(newString + where);
}

输出:

UPDATE DEPARTMENT SET DNO = 1, NAME = 'foo', TEST_ID = 8 WHERE DNO = 2 AND NAME = 'ADM' AND TEST_ID = 1

您可以进一步优化代码。这仅用于说明目的。

【讨论】:

  • 非常用户满...谢谢
  • @Madhava 欢迎您!我已经更新了代码以制作 UPDATE 声明。希望对你有用。
  • 非常感谢@user2004685
【解决方案2】:

第一种方法,用正则表达式分割你的字符串。所需的字符串将在数组中位于 idex 2(表名)、索引 3(列名)和索引 5(值):

public static void main(String[] args){        

    String stat="INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";
    String[] strings = stat.split("[\\(\\)]|(\\b\\s\\b)");

    System.out.println(strings[2]);
    System.out.println(strings[3]);
    System.out.println(strings[5]);
}

输出将是:

DEPARTMENT
DNO, NAME, TEST_ID
2, 'ADM', 1

要获得单独的列名,可以再次拆分对应的字符串:

public static void main(String[] args){        

    String stat="INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";
    String[] strings = stat.split("[\\(\\)]|(\\b\\s\\b)");

    String[] columnNames = (strings[3].split(",\\s"));
    for(String s:columnNames){
        System.out.println(s);
    }
}

输出将是:

DNO
NAME
TEST_ID

您可以以相同的方式处理具有值的字符串。这种方法的代码更少。

第二种方法(我更喜欢)是简单的正则表达式:

publi static main(String[]args) {

    String stat="INSERT INTO DEPARTMENT(DNO, NAME, TEST_ID) VALUES (2, 'ADM', 1)";
    Pattern pattern = Pattern.compile("INSERT INTO (\\w+)\\((.*)\\) VALUES \\((.*)\\)");
    Matcher matcher = pattern.matcher(stat);
    if(matcher.find()){
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
        System.out.println(matcher.group(3));
    }
}

输出将是:

DEPARTMENT
DNO, NAME, TEST_ID
2, 'ADM', 1

【讨论】:

  • 非常有用的答案...谢谢肯
  • 如何格式化字符串,如“UPDATE Department Name='ADM', Test_id=1 WHERE id=2
  • 用 StringBuilder 类来做。添加update 关键字和表名。当您获得两个具有名称和值的数组时,只需在 for 循环中迭代此数组,编写字符串 (name+"="+value),然后将其添加到您的构建器中。
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多