【问题标题】:How do you use a WHERE clause to filter out duplicate data, Without hard coding?如何使用 WHERE 子句过滤掉重复数据,而无需硬编码?
【发布时间】:2016-07-14 09:46:04
【问题描述】:

我已经坐了好几天了,在网上到处搜索,但没有找到合适的答案

我的问题描述,我需要从传入的 .csv 文件中过滤重复数据,检查该数据是否已经在表中,如果没有,则保留数据,否则不要插入数据。我的方法,我逐行读取一个唯一的 .csv 文件,我使用一个preparedStatement,假设使用 WHERE 子句来检查重复项。

我遇到的问题是,如何在preparedStatement 中使用WHERE 子句。

以下是我的一些代码,以消除任何混淆。

PS:这就是 ,message_id 的样子 有数千个。

try { 
            dataRow = reader.readLine();
            while ((dataRow = reader.readLine()) != null) {     
                totalRecordsProcessed++;
                dataRow = dataRow.replace("\"", "");
                dataRow = dataRow.replace("<", "");
                dataRow = dataRow.replace(">", "");                         
                dataItems = dataRow.split(",", -1);             
                ExchangeReport exchangeReport = new ExchangeReport(dataItems);                                              
                //System.out.println(exchangeReport.toString());
                persistData(exchangeReport);                
            }           
        }

//在insert方法中检查一下我们是否持久化了重复数据 public void persistData(ExchangeReport exchangeReport) 抛出 SQLException{

    Connection connection = super.getEnvironment().getConnection();   
    PreparedStatement preparedStatement = null;     
    String insertScript = null;     
    String skipScript = null;

    //ResultSet incomeSet;      
    ArrayList<String> rowVals = new ArrayList();

    ArrayList<String> dbList = new ArrayList<String>(); 
    ArrayList<String> incomeList = new ArrayList<String>();

    String tempVal = null;


    skipScript = "select unique_ref, message_id, event_id from InboundCorres " +
            "where message_id = " +
            "";
    preparedStatement = connection.prepareStatement(skipScript);
    ResultSet dbSet = preparedStatement.executeQuery();
    while (dbSet.next()) {
        rowVals.add(dbSet.getString(1).trim());
        rowVals.add(dbSet.getString(2).trim());
        rowVals.add(dbSet.getString(3).trim());
        System.out.println(rowVals.toString());
    }


    //List<String> incomeList = Arrays.asList(dataItems);                                                                           

    insertScript = "INSERT INTO INBOUNDCORRES(EVENT_ID, SOURCE_INBOUND, TIME_STAMP," + 
            "RECIPIENTS, MESSAGE_SUBJECT, SENDER, MESSAGE_ID," + 
            "CONNECTOR_ID, UNIQUE_REF)" + 
            "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
    preparedStatement = connection.prepareStatement(insertScript);
    preparedStatement.setString(1, exchangeReport.getEventId() );
    preparedStatement.setString(2, exchangeReport.getSourceInbound() );
    preparedStatement.setString(3, exchangeReport.getTimeStamp() ); 
    preparedStatement.setString(4, exchangeReport.getRecipient());
    preparedStatement.setString(5, exchangeReport.getMessageSubject());
    preparedStatement.setString(6, exchangeReport.getSender());
    preparedStatement.setString(7, exchangeReport.getMessageId());
    preparedStatement.setString(8, exchangeReport.getConnectorId());
    preparedStatement.setString(9, exchangeReport.getUniqueRef());
    preparedStatement.executeUpdate();              

}

【问题讨论】:

  • 这个语句在做什么(尤其是 where 子句)? skipScript = "select unique_ref, message_id, event_id from InboundCorres " + "where message_id = " + "";
  • 使用不同的关键字
  • 该语句应该进行实际的重复检查,然后跳过重复插入到表中。请注意,message_id 列将始终有 2 个相同的 message_id,一个用于接收,另一个用于传递。

标签: java sql


【解决方案1】:

skipScript中的SQL语句不完整。

我希望看到类似的东西:

skipScript = "从 InboundCorres 中选择 unique_ref、message_id、event_id" + "其中 message_id = :msg_id";

所以 message_id 是列名,msg_id 是一个本地字符串变量,用于保存我们要查找的值。

要获取 msg_id 中的值,我们可以调用一个名为 saveMessage() 的方法,它看起来像:

public void saveMessage (final String messageId) {
    Map<String, Object> values = new HashMap<String, Object>();
    values.put("msg_id", messageId);
    jdbcTemplate.update(skipScript , values);
}

请注意,我特意为 message_id 使用了三个不同的名称,以明确发生了什么。

希望这会有所帮助。我意识到我的示例使用了 jdbcTemplate.update(),这与代码示例不同,但原理相似。

【讨论】:

  • 它确实消除了一些混乱,谢谢。对skipScript的一些更深入的了解,我不完整,因为我有点困惑。我基本上想做的是这样的。 ==> skipScript = "从 InboundCorres 中选择 unique_ref、message_id、event_id " + "其中 message_id = :msg_id";其中 msg_id 是传入 message_id 的列表。有没有办法可以在 WHERE 子句中检查传入的数据?
【解决方案2】:

感谢 user4810988,您帮助我找到了解决方案。

skipScript = "select TIME_STAMP " +
                " from InboundCorres where unique_ref = ? " +
                "and message_id = ? " +
                "and event_id = ?";     
        preparedStatement = connection.prepareStatement(skipScript);
        preparedStatement.setString(1, exchangeReport.getUniqueRef());
        preparedStatement.setString(2, exchangeReport.getMessageId());
        preparedStatement.setString(3, exchangeReport.getEventId());

        ResultSet dbSet = preparedStatement.executeQuery();
        while (dbSet.next()) {
            rowVals.add(dbSet.getString(1).trim());
            rowVals.add(dbSet.getString(2).trim());
            rowVals.add(dbSet.getString(3).trim());
            System.out.println("Duplicates found ==>" + rowVals.toString());
        }

这就是我一直在寻找的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2016-10-09
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多