生成带有三列名称的随机 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 的代码。这里table
是ReadTableConnectionInfo
对象。
@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 总是在那里的主要内容,如果未能解决你的问题,请参考以下文章