2012-03-08 73 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