2016-07-14 12 views
1

Ich habe mit diesem für ein paar Tage gesessen, Online High-Low-Suche, aber habe keine richtige AntwortWie verwenden Sie eine WHERE-Klausel, um doppelte Daten herauszufiltern, ohne harte Codierung?

Meine Problembeschreibung, muss ich doppelte Daten aus einer eingehenden .csv-Datei, tun a Überprüfen Sie, ob diese Daten bereits in der Tabelle vorhanden sind, wenn sie dann keine Daten beibehalten, andernfalls fügen Sie keine Daten ein. Meine Methode, die ich in einer eindeutigen CSV-Datei Zeile für Zeile einlese, verwende ich eine preparedStatement, die die WHERE-Klausel verwenden soll, um die Duplikate zu überprüfen.

Der Teil, mit dem ich ein Problem habe, ist, wie man die WHERE-Klausel in meinem preparedStatement verwendet.

Im Folgenden finden Sie einige meiner Code, um jede Verwirrung zu klären.

PS: Das ist, was die Nachricht aussieht < [email protected]> es gibt Tausende von ihnen.

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);     
      }   
     } 

// Führt eine Überprüfung in der insert-Methode, um zu sehen, ob wir doppelte Daten public void persistData sind persistierende (ExchangeReport exchangeReport) throws 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();    

} 
+0

Was macht diese Anweisung (vor allem where-Klausel)? 'skipScript =" select unique_ref, message_id, ereignis_id von InboundCorres "+ " wo message_id = "+ " "; – SMA

+0

Verwenden Sie das eindeutige Schlüsselwort –

+0

Die Anweisung sollte die tatsächliche Duplizierungsprüfung durchführen und dann das Einfügen von Duplikaten in die Tabelle überspringen. Beachten Sie, dass die Spalte "message_id" immer zwei gleiche Nachrichten enthält, nämlich eine Nachricht für empfangen und eine andere für die Zustellung. – ReiClay

Antwort

0

Die SQL-Anweisung in skipScript ist unvollständig.

würde ich erwarten, wie etwas zu sehen:

skipScript = "select unique_ref, message_id, event_id von InboundCorres" + "wo message_id =: msg_id";

Also message_id ist der Spaltenname und msg_id ist eine lokale String-Variable, die den gesuchten Wert enthält.

Um den Wert in msg_id zu bekommen, könnten wir eine Methode aufrufen saveMessage() aufgerufen, die etwas aussehen würde:

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

Bitte beachte, dass ich absichtlich drei verschiedene Namen verwendet haben, für message_id es deutlich zu machen, was ist geht weiter.

Hoffe, das hilft. Ich realisiere mein Beispiel verwendet jdbcTemplate.update(), die nicht wie das Codebeispiel ist, aber das Prinzip ist ähnlich.

+0

Es macht etwas Verwirrung, danke. Etwas mehr Einblick in skipScript, ich habe es unvollständig gelassen, weil ich ein bisschen verwirrt bin. Was ich im Wesentlichen tun möchte, ist so etwas. ==> skipScript = "select unique_ref, message_id, event_id von InboundCorres" + "where message_id =: msg_id"; msg_id ist die Liste der eingehenden Nachrichten-IDs.Gibt es einen Weg, den ich gegen diese eingehenden Daten innerhalb der WHERE-Klausel überprüfen kann? – ReiClay

0

Vielen Dank user4810988, Sie haben mir geholfen, eine Lösung zu finden.

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()); 
     } 

Das ist die Lösung, die ich suchte.

Verwandte Themen