2012-03-08 33 views
13

Tengo 100 de células en nuestra base de datos que contienen ? en lugar de '. Es posible que esto ocurra en todas las filas y columnas y en más de una palabra por celda. Aquí hay un ejemplo de solo una celda.¿Cómo reemplazar un carácter de una cadena en SQL?

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

Quiero escribir una instrucción SQL que encuentra todas las celdas que contienen ? (puede ser más de uno por célula) y reemplazarlos con '. Estoy seguro de que todos los ? tienen que ser reemplazados sin excepción.

Sé que hay una función de reemplazar pero no pude saber cómo extraer un carácter de una cadena en sql.

Este es un ejemplo que obtuve pero no pudo ayudarme.

UPDATE dbo.authors 

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

¿Alguna idea?

+0

Usted está tratando de actualizar '?' 'A '''? '''' es una cadena vacía, que es idéntica a 'null' en Oracle. – Ben

+0

Posible duplicado de [¿Cómo reemplazar valores específicos en una columna de la base de datos de Oracle?] (Http://stackoverflow.com/questions/3443156/how-to-replace-specific-values-in-a-oracle-database-column) – Vadzim

Respuesta

16

¿Estás seguro de que los datos almacenados en la base de datos es en realidad un signo de interrogación? Tiendo a sospechar a partir de los datos de muestra que el problema es una conversión de conjunto de caracteres donde ? se está utilizando como el carácter de reemplazo cuando el carácter no se puede representar en el juego de caracteres del cliente. Posiblemente, la base de datos en realidad está almacenando caracteres de "comillas inteligentes" de Microsoft en lugar de simples apóstrofos.

¿Qué muestra la función DUMP realmente almacenada en la base de datos?

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

¿Qué aplicación está utilizando para ver los datos? ¿Cuál es el NLS_LANG establecido por el cliente?

¿Cuál es la base de datos y el conjunto de caracteres nacionales? ¿Los datos están almacenados en una columna VARCHAR2? O NVARCHAR2?

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

Si todos los personajes de problemas se almacenan en la base de datos como 0x19 (decimal 25), su REPLACE tendría que ser algo así como

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

. Eso podría ser cierto. Lo miraré. Aunque no tengo idea de qué es NLS_LANG. Los datos se almacenan como VARCHAR2 Gracias – WowBow

+0

@Justin. Lo descubrí en la base de datos. El personaje ni siquiera es visible ... es un espacio vacío. Al ejecutar el método de volcado en el nombre de la columna encontré esto. >> Typ = 1 Len = 38 CharacterSet = US7ASCII: 53,74,75,64,65,6e, 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 . ¿Qué significa? Y cuando se muestra, ni siquiera es un signo de interrogación, sino un personaje con cable. El personaje contiene algo que se parece a 0019. – WowBow

+0

@WowBow - ¿Es ese el 'DUMP' que corresponde a los datos de muestra que publicaste (" Parents? CUI asumió igual a la suma de los padres del padrastro y su madre?/ingresos de madrastra ")? Esos dos no parecen coincidir. –

7

Esto reemplazará todos ? con ':

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

Si necesita actualizar más de una columna, puede cambiar city cada vez que se ejecuta a un nombre de columna diferente, o una lista de las columnas como tal :

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

¿no necesitamos una cláusula where? – WowBow

+0

@MatX: una cláusula where filtrará las filas para que solo se controlen las que necesitan actualización. La única ventaja es el rendimiento, pero es un punto que vale la pena. Lo agregaré a la consulta – Curt

+0

Oh ... ¿qué tal si estoy actualizando más de una columna ... es decir, tendré más de una declaración SET? ¿Cómo debería escribir la cláusula Where en ese caso porque estoy tratando con más de una columna? – WowBow

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

Use la función REPLACE.

por ejemplo: SELECT REPLACE ('t? Es? T', '?', 'W');

Source

+1

Otras dos respuestas dicen lo mismo. –

Cuestiones relacionadas