2012-03-08 74 views
13

我在我们的数据库中有100个单元格,其中包含?而不是'。这可能会发生在所有行和列中,并且每个单元格可能会出现多个单词。这是一个单元格的例子。如何从SQL中的字符串替换字符?

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

我想写这将找到所有包含?细胞的SQL语句(可能是每个小区不止一个),并与'替换它们。我相信所有的?必须无一例外地被替换。

我知道有一个函数替换,但我无法知道如何从SQL中的字符串中提取字符。

这是我得到的一个例子,但它不能帮助我。

UPDATE dbo.authors 

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

任何想法?

+0

您正在尝试将'?'更新为''''? ''''是一个空字符串,与Oracle中的'null'完全相同。 – Ben 2012-03-08 17:25:17

+0

[如何替换Oracle数据库列中的特定值?](http://stackoverflow.com/questions/3443156/how-to-replace-specific-values-in-a-oracle-database-column) – Vadzim 2016-11-16 17:23:06

回答

16

你确定存储在数据库中的数据实际上是一个问号?我倾向于从样本数据中怀疑问题是字符集转换之一,其中?被用作替换字符,当字符不能在客户端字符集中表示时。可能地,数据库实际上存储了微软的“智能报价”字符,而不是简单的撇号。

DUMP函数显示的内容实际上是否存储在数据库中?

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

您使用什么应用程序查看数据?客户的NLS_LANG设置为什么?

什么是数据库和国家字符集?数据是否存储在VARCHAR2列中?或者NVARCHAR2

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

如果所有问题的字符将存储在数据库中为0x19(十进制25),您REPLACE将需要像

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

这可能是对的。我会看着它。虽然我不知道NLS_LANG是什么。数据存储为VARCHAR2谢谢 – WowBow 2012-03-08 17:34:37

+0

@Justin ..我在数据库中发现。角色甚至不可见......这是空的空间。 >> Typ = 1 Len = 38 CharacterSet = US7ASCII:53,74,75,64,65,6e,74,19,73,20,53,53,4e通过在列名上运行dump方法, ,20,6d,61,74,63,68,2c,20,62,75,74,20,6e,1207米,20,6e,61,6d,65,20,6d,61,74,63,68 。 这是什么意思?当它被显示时,它甚至不是问号,而是一些有线字符。该字符包含的东西看起来像0019. – WowBow 2012-03-08 20:29:02

+0

@WowBow - 这是对应于您发布的样本数据的“DUMP”(“父母?CUI假定等于父亲的继父母/继父母亲和母亲的总和/继母的收入。“)?这两个似乎不匹配。 – 2012-03-08 20:34:49

7

这将替换所有?'

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

如果您需要更新多个列,您可以每次执行一个不同的列名时间改变city,或列出列像这样:

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

我们不需要一个where子句吗? – WowBow 2012-03-08 17:19:18

+0

@MatX - where子句将只对行进行过滤,以便仅检查需要更新的行。唯一的好处是性能,但它是一个值得的点。我将它添加到查询 – Curt 2012-03-08 17:20:14

+0

噢......如果我正在更新多个列,那么该如何?即,我将拥有多个SET语句。我应该如何编写where子句,因为我正在处理多个列? – WowBow 2012-03-08 17:22:45

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

使用替换功能。例如:SELECT REPLACE('t?es?t','?','w');

Source

+1

另外两个答案说同样的事情。 – 2014-06-27 00:52:18