生成带有三列名称的随机 SELECT sql 总是在那里

Posted

技术标签:

【中文标题】生成带有三列名称的随机 SELECT sql 总是在那里【英文标题】:Generate Random SELECT sql with three columns name always in there 【发布时间】: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,用户选择的列是什么意思? 【参考方案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 应该一直存在。

以上是关于生成带有三列名称的随机 SELECT sql 总是在那里的主要内容,如果未能解决你的问题,请参考以下文章

随机名称表中的 SQL 更新

Sql Server备份表,动态生成表名称

Sql Server备份表,动态生成表名称

如何在带有 MIN 的 SELECT 中包含第三列

sql 生成随机字符串

Sql 随机生成电话号码