2016-06-10 9 views
1

Ich versuche, bestimmte Kundennamen in meinen Daten zu ersetzen. Ich war in der Lage SQL mit Google BigQuery Sprache zu tun, um einen Teil der Zeichenfolge ein anderes über die Replace-Funktion für eine bestimmte Zeichenfolge zu transformieren.Google BigQuery Replace-Funktion für String-Typ

Replace(CustomerName, 'ABC', 'XYZ') 

Ich habe allerdings ein paar mehr, dass ich die ersetzen verwenden müsste Funktion, so dass

Replace(CustomerName, 'PLO', 'Rustic') 
Replace(CustomerName, 'Kix', 'BowWow') 

und so weiter.

Ich habe versucht,

Replace(CustomerName, 'ABC', 'XYZ') OR Replace(CustomerName, 'PLO', 'Rustic') OR Replace(CustomerName, 'Kix', 'BowWow')

tun, aber das hat mir eine Fehlermeldung.

Ich habe auch versucht,

Replace(CustomerName, 'ABC', 'XYZ') AND Replace(CustomerName, 'PLO', 'Rustic') AND Replace(CustomerName, 'Kix', 'BowWow')

aber das hat mir auch eine Fehlermeldung.

Ich bin in der Lage, nur "case when Anweisung" zu verwenden und dann hardcodieren, aber ich frage mich, ob es eine bessere/schnellere Möglichkeit gibt, ersetzen Sie stattdessen ersetzen.

Danke für Ihre Hilfe.

Antwort

0

Die Option CASE WHEN ist ziemlich vernünftig. Eine weitere Möglichkeit ist, sie zusammen zu verketten:

REPLACE(
    REPLACE(
    REPLACE(
     CustomerName, 
     'ABC', 
     'XYZ'), 
    'PLO', 
    'Rustic'), 
    'Kix', 
    'BowWow') 

, welche Sie wirklich auf das genaue Szenario hängt holen. Die verketteten REPLACE-Aufrufe sind wahrscheinlich schneller, aber sie könnten sich in merkwürdiger Weise überlappen (z. B. wenn die Ausgabe zu einer Ersetzung die Eingabe mit einer nachfolgenden übereinstimmt). Der Ansatz CASE WHEN vermeidet dieses Problem, aber es ist wahrscheinlich teurer, weil Sie eine Operation ausführen müssen, um die Teilzeichenfolge zu finden, und eine andere, um sie tatsächlich zu ersetzen.

Beachten Sie, dass, wenn Sie AND oder OR verwenden, Sie versuchen, die Zeichenfolge Ausgabe von REPLACE zu kombinieren, als ob es ein boolean waren, weshalb es versagt.

+0

Dies funktioniert perfekt! Vielen Dank und danke für die Erklärung, warum es scheiterte. Sehr geschätzt. – Anya

0

In Fällen, in denen Sie eine Vielzahl von Ersatzteilen haben - Verkettung von REPLACEs kann nicht praktikabel und lästige manuelle Arbeit werden.
Im Folgenden befaßt sich mit diesem potenziellen Problem (vorausgesetzt, Sie Lookup-Tabelle mit Paaren halten: Word, Replacement)

SELECT CustomerName, fixedCustomerName FROM JS(
// input table 
(
    SELECT 
    CustomerName, Replacements 
    FROM YourTable 
    CROSS JOIN (
    SELECT 
     GROUP_CONCAT_UNQUOTED(CONCAT(Word, ',', Replacement), ';') AS Replacements 
    FROM ReplacementLookup 
) , 
// input columns 
CustomerName, Replacements, 
// output schema 
"[ 
{name: 'CustomerName', type: 'string'}, 
{name: 'fixedCustomerName', type: 'string'} 
]", 
// function 
"function(r, emit){ 
    var Replacements = r.Replacements.split(';'); 
    var fixedCustomerName = r.CustomerName; 
    for (var i = 0; i < Replacements.length; i++) { 
    var pat = new RegExp(Replacements[i].split(',')[0],'gi') 
    fixedCustomerName = fixedCustomerName.replace(pat, Replacements[i].split(',')[1]); 
    } 
    emit({CustomerName: r.CustomerName,fixedCustomerName: fixedCustomerName}); 
}" 
) 

Sie es unten am Beispiel testen

SELECT CustomerName, fixedCustomerName FROM JS(
// input table 
(
    SELECT 
    CustomerName, Replacements 
    FROM (
    SELECT CustomerName FROM 
     (SELECT '1234ABC567' AS CustomerName), 
     (SELECT '12 34 PLO 56' AS CustomerName), 
     (SELECT 'Kix' AS CustomerName), 
     (SELECT '98 ABC PLO Kix ABC 76 XYZ 54' AS CustomerName), 
     (SELECT 'ABCQweKIX' AS CustomerName) 
) YourTable 
    CROSS JOIN (
    SELECT 
     GROUP_CONCAT_UNQUOTED(CONCAT(Word, ',', Replacement), ';') AS Replacements 
    FROM (
     SELECT Word, Replacement FROM 
     (SELECT 'XYZ' AS Word, 'QWE' AS Replacement), 
     (SELECT 'ABC' AS Word, 'XYZ' AS Replacement), 
     (SELECT 'PLO' AS Word, 'Rustic' AS Replacement), 
     (SELECT 'Kix' AS Word, 'BowWow' AS Replacement) 
    ) 
) ReplacementLookup 
) , 
// input columns 
CustomerName, Replacements, 
// output schema 
"[ 
{name: 'CustomerName', type: 'string'}, 
{name: 'fixedCustomerName', type: 'string'} 
]", 
// function 
"function(r, emit){ 
    var Replacements = r.Replacements.split(';'); 
    var fixedCustomerName = r.CustomerName; 
    for (var i = 0; i < Replacements.length; i++) { 
    var pat = new RegExp(Replacements[i].split(',')[0],'gi') 
    fixedCustomerName = fixedCustomerName.replace(pat, Replacements[i].split(',')[1]); 
    } 
    emit({CustomerName: r.CustomerName,fixedCustomerName: fixedCustomerName}); 
}" 
) 

Bitte beachten: nach wie vor, wenn das Ergebnis wird ausstellen von einem Ersatz entspricht der Eingang zu einem späteren Ersatz

+0

Danke! Schätzen Sie Ihre Hilfe dazu. – Anya

Verwandte Themen