web-dev-qa-db-fra.com

Comment remplacer un caractère d'une chaîne en SQL?

J'ai des centaines de cellules dans notre base de données qui contiennent ? au lieu de '. Il est possible que cela se produise dans toutes les lignes et colonnes et dans plus d'un mot par cellule. Voici un exemple d'une seule cellule.

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

Je veux écrire une instruction SQL qui trouve toutes les cellules qui contiennent ? (peut être supérieur à un par cellule) et remplacez-les par '. Je suis sûr que tout ? doivent être remplacés sans exception.

Je sais qu'il y a une fonction remplacer mais je ne savais pas comment extraire un caractère d'une chaîne en sql.

C'est un exemple que j'ai eu mais cela ne pouvait pas m'aider.

UPDATE dbo.authors

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

Des idées?

13
WowBow

Êtes-vous sûr que les données stockées dans la base de données sont en fait un point d'interrogation? J'aurais tendance à soupçonner à partir des données d'exemple que le problème est celui de la conversion du jeu de caractères où ? Est utilisé comme caractère de remplacement lorsque le caractère ne peut pas être représenté dans le jeu de caractères client. Il est possible que la base de données stocke en fait des caractères Microsoft "smart quote" plutôt que de simples apostrophes.

Qu'est-ce que la fonction DUMP montre est réellement stockée dans la base de données?

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

Quelle application utilisez-vous pour afficher les données? Quelle est la valeur du NLS_LANG Du client?

Qu'est-ce que la base de données et le jeu de caractères nationaux? Les données sont-elles stockées dans une colonne VARCHAR2? Ou NVARCHAR2?

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

Si tous les caractères problématiques sont stockés dans la base de données sous la forme 0x19 (décimal 25), votre REPLACE devrait être quelque chose comme

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
16
Justin Cave
UPDATE databaseName.tableName
SET columnName = replace(columnName, '?', '''')
WHERE columnName LIKE '%?%'
15
JesseBuesking

Cela remplacera tous les ? avec ':

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

Si vous devez mettre à jour plusieurs colonnes, vous pouvez soit modifier city chaque fois que vous exécutez un nom de colonne différent, soit répertorier les colonnes comme suit:

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

Utilisez la fonction REMPLACER.

par exemple: SELECT REPLACE ('t? es? t', '?', 'w');

Source

1
user3781264