2012-03-08 13 views
13

Mam 100 komórek w naszej bazie danych, które zawierają ? zamiast '. Możliwe, że może się to zdarzyć we wszystkich wierszach i kolumnach oraz w więcej niż jednym słowie na komórkę. Oto przykład tylko jednej komórki.Jak zamienić znak z ciągu w SQL?

Parents? CUI assumed equal to the sum of the father?s/stepfather?s and mother?s/ stepmother?s income . 

Chcę napisać instrukcję SQL, które wyszukuje wszystkie komórki zawierające ? (może być więcej niż jeden na ogniwo) i zastąpić je '. Jestem pewien, że wszystkie ? muszą zostać wymienione bez wyjątku.

Wiem, że istnieje funkcja zastąpić, ale nie mogłem wiedzieć, jak wyodrębnić znak z ciągu w sql.

To jeden z przykładów, ale nie mógł mi pomóc.

UPDATE dbo.authors 

SET city = replace(city, 'Salt', 'Olympic') 
WHERE city LIKE 'Salt%'; 

Jakieś pomysły?

+0

Próbujesz zaktualizować '?' Do ''''? '' '' jest pustym łańcuchem, który jest identyczny z 'null' w Oracle. – Ben

+0

Możliwy duplikat [Jak zastąpić określone wartości w kolumnie bazy danych Oracle?] (Http://stackoverflow.com/questions/3443156/how-to-replace-specific-values-in-a-oracle-database-column) – Vadzim

Odpowiedz

16

Czy jesteś pewien, że dane przechowywane w bazie danych jest rzeczywiście znak zapytania? Byłbym skłonny podejrzewać z przykładowych danych, że problemem jest jedna z konwersji zestawu znaków, gdzie ? jest używany jako znak zastępczy, gdy znak nie może być reprezentowany w zestawie znaków klienta. Prawdopodobnie baza danych faktycznie zapisuje znaki "inteligentnego cytatu" firmy Microsoft, a nie proste apostrofy.

Co pokazuje funkcja DUMP w bazie danych?

SELECT column_name, 
     dump(column_name,1016) 
    FROM your_table 
WHERE <<predicate that returns just the sample data you posted>> 

Jakiej aplikacji używasz do przeglądania danych? Do czego służy klient NLS_LANG?

Co to jest baza danych i zestaw znaków narodowych? Czy dane są przechowywane w kolumnie VARCHAR2? Lub NVARCHAR2?

SELECT parameter, value 
    FROM v$nls_parameters 
WHERE parameter LIKE '%CHARACTERSET'; 

Jeśli wszystkie znaki problemowe są przechowywane w bazie danych jako 0x19 (25 po przecinku), Twój REPLACE musiałoby być coś

UPDATE table_name 
    SET column1 = REPLACE(column1, chr(25), q'[']'), 
     column2 = REPLACE(column2, chr(25), q'[']'), 
     ... 
     columnN = REPLACE(columnN, chr(25), q'[']') 
WHERE INSTR(column1,chr(25)) > 0 
    OR INSTR(column2,chr(25)) > 0 
    ... 
    OR INSTR(columnN,chr(25)) > 0 
+0

To może być prawdą. Przyjrzę się temu. Chociaż nie mam pojęcia, czym jest NLS_LANG. Dane są przechowywane jako VARCHAR2. Dzięki – WowBow

+0

@Justin .. dowiedziałem się o tym w bazie danych. Postać nie jest nawet widoczna ... jest pustą przestrzenią. Przez uruchomienie metody zrzutu na nazwę kolumny znalazłem to. >> Typ = 1 Len = 38 CharacterSet = US7ASCII: 53,74,75,64,65,6, 74,19,73,20,53,53,4e 20,6d, 61,74,63,68,2c, 20 62,75,74,20,6e, 6f, 20,6e, 61,6d, 65,20,6d, 61,74,63,68 . Co to znaczy? A kiedy jest wyświetlany, nie jest to nawet znak zapytania, ale jakiś charakter przewodowy. Postać zawiera coś, co wygląda jak 0019. – WowBow

+0

@WowBow - Czy to "DUMP", który odpowiada przykładowym danym, które wysłałeś ("Rodzice? CUI przyjęto jako równe sumie ojca/ojczyma i matki?/dochody macochy. ")? Ci dwaj nie wydają się pasować. –

7

Spowoduje to zastąpienie wszystkich ? z ':

UPDATE dbo.authors  
SET city = replace(city, '?', '''') 
WHERE city LIKE '%?%' 

Jeśli trzeba zaktualizować więcej niż jedną kolumnę, można zmienić city każdorazowo wykonać do innej nazwy kolumny lub listy kolumn, podobnie jak :

UPDATE dbo.authors  
SET city = replace(city, '?', '''') 
     ,columnA = replace(columnA, '?', '''') 
WHERE city LIKE '%?%' 
OR columnA LIKE '%?%' 
+0

nie potrzebujemy klauzuli where? – WowBow

+0

@MatX - A klauzula where po prostu odfiltruje wiersze, więc sprawdza tylko te, które wymagają aktualizacji. Jedyną zaletą jest wydajność, ale jest to wart uwagi. Dodam go do kwerendy – Curt

+0

Oh ... co jeśli zaktualizuję więcej niż jedną kolumnę .. ie będę miał więcej niż jedną instrukcję SET. Jak mam napisać klauzulę where w tym przypadku, ponieważ mam do czynienia z więcej niż jedną kolumną? – WowBow

15
UPDATE databaseName.tableName 
SET columnName = replace(columnName, '?', '''') 
WHERE columnName LIKE '%?%' 
1

użyć funkcji wymienić.

np .: SELECT REPLACE ('t? Es? T', '?', 'W');

Source

+1

Dwie inne odpowiedzi mówią to samo. –