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