【问题标题】:Generate Random SELECT sql with three columns name always in there生成带有三列名称的随机 SELECT sql 总是在那里
【发布时间】:2013-02-24 07:35:03
【问题描述】:

我有一个名为ReadTableConnectionInfo 的类,其中包含有关表的详细信息,例如tableName,它是columns。我编写了一个多线程代码,我应该在其中使用来自table.getColumns() 的列值生成一个随机选择 sql。

假设 table1 有 8 列,例如-

ID
CREATION
DATE
ACCOUNT
ADVERTISE
SELLERS
GEOGRAPHIC
DEMOGRAPHIC

下面是我尝试使用列生成随机选择 sql 的代码。这里tableReadTableConnectionInfo 对象。

@Override
public void run() {

        while (System.currentTimeMillis() <= 30 minutes) {

        final String selectSql = generateRandomSQL(table);

        preparedStatement = entry.getValue().prepareCall(selectSql);
        preparedStatement.setString(id);

        rs = preparedStatement.executeQuery();
    }
}   
    /**
     * A simple method that will construct the SQL
     * and return back
     * @param columns
     * @return sql
     */
    private String generateRandomSQL(ReadTableConnectionInfo table) {

        /* generate random columns from 
             * `table.getColumns`, not sure how to make that
             */
            final String sql = "SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE,  from "+table.getTableName+" where id = ?";

        return sql;
    }

下面是我的ReadTableConncectionInfo class,它将保存 tableName 和 columns list

public class ReadTableConnectionInfo {

    public String tableName;
    public ArrayList<String> columns;

    public ArrayList<String> getColumns() {
        return columns;
    }

    public void setColumns(ArrayList<String> columns) {
        this.columns = columns;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
}

现在我需要从table.getColumns() 列表中的generateRandomSQL 方法中生成随机选择SQL。在我所有的 SELECT sql 中,我将始终拥有 ID, CREATION and DATE,除此之外,它应该是随机的

示例 SQL 示例-

`SELECT ID, CREATION, DATE, ACCOUNT from table1 where id = ?`
`SELECT ID, CREATION, DATE, ACCOUNT, ADVERTISE from table1 where id = ?`
`SELECT ID, CREATION, DATE, ACCOUNT, SELLERS from table1 where id = ?`
`SELECT ID, CREATION, DATE, GEOGRAPHIC, DEMOGRAPHIC, ADVERTISE from table1 where id = ?`
`Other possible permutations`

任何人都可以帮助我构建带有 ID、CREATION 和 DATE 的随机 SELECT sql 吗?任何建议都会有很大帮助。

【问题讨论】:

  • 为什么不直接选择所有列并随机化您从目标代码中提取的列?这会比构建动态 SQL 更好。
  • 是的,这是我想到的一个选项。但是我们正在尝试复制生产场景,这意味着人们不会来寻找所有的列。有些人会来找三列,有些人会来找两列,有些人会来找所有列。这就是我尝试构建动态 SQL 的原因。
  • 我猜你是想说,我应该选择所有列,然后随机排列顺序对吗?如果是的话,那我基本上不是在找那个。
  • 随机列或用户选择的列?
  • @arpit,用户选择的列是什么意思?

标签: java database multithreading jdbc prepared-statement


【解决方案1】:
private String generateRandomSQL(ReadTableConnectionInfo table) {
    Random r = new Random(table.getColumns.size());
    int rNumber = r.nextInt();

    List<String> suffledColumns = new ArrayList<String>(table.getColumns());
    Collections.shuffle(suffledColumns);

    String columnsList = "";

    for(int i = 0 ; i < rNumber ; i ++){
        columnsList += ("," + shuffledColumns.get(i));
    }

    final String sql = "SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE" + columnsList +"  from " + table.getTableName() + " where id = ?";

        return sql;
}

【讨论】:

  • 感谢 Arsen 的建议。在你的第一点你错过了什么?它看起来有点混乱。如果可能的话,你能给我一个例子,我将能够理解更多。提前致谢。
  • 嗯 你认为我搞砸了什么? :) 也许像 {0}、{1} 这样的参数很奇怪?您应该将此字符串定义为类中的静态字段
  • 为什么括号中有日期?为什么只有 {0} 和{1}。我想,我现在很困惑。如果您可以提供任何对我有好处的代码示例。我可以学到更多的东西
  • 好吧,DATE 是 SQL 中的保留字,为了避免有时失败,我在括号中定义了它。不要对 {0} 和 {1} 参数感到困惑,这些只是您将在生成期间提供的参数。 {0} 是用逗号分隔的随机列列表字符串,{1} 是表名。阅读 MessageFormat.format(...)
  • 感谢阿森的帮助。上面代码的一个问题。我不这么认为,每次都创建 Random 对象是一个好习惯。因为我有我的 while 循环,它将调用 generateRandomSql 方法。如果 Random 对象被创建一次就好了。
【解决方案2】:

类似的东西:

   String colPart="SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE"
   Random rNo=new Random();
   int noOfCols=columns.size();
   int colCount=rNo.nextInt(noOfCols-3);
   for(int i=0;i<colCount;i++){
   string colToAdd=columns.get(3+rNo.nextInt(noOfCols-3));
   if(!colPart.contains(colToAdd))    
       colPart+=","+colToAdd;
   }        
    final String sql =colPart+" from "+table.getTableName+" where id = ?";

【讨论】:

  • @Farhan 评论如果你想要不同的话。因为我不确定这是你想要的。
  • 就我而言,我将列作为字符串的 ArrayList。所以最后的sql行会报错。
  • @FarhanJamal 好的,我进行了更正。你可以使用get() 方法。
  • 用你的方法,我永远只能停留在四列,对吧?
  • 是的,任意数量的列。只是,ID、CREATION、DATE 应该一直存在。
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2015-11-23
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多