2012-03-08 39 views
13

Tôi có 100 ô trong cơ sở dữ liệu của chúng tôi chứa ? thay vì '. Có thể điều này có thể xảy ra ở tất cả các hàng và cột và trong nhiều hơn một từ trên mỗi ô. Đây là một ví dụ về chỉ một ô.Làm thế nào để thay thế một ký tự từ một String trong SQL?

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

Tôi muốn viết một câu lệnh SQL mà tìm tất cả các tế bào có chứa ? (có thể nhiều hơn một mỗi tế bào) và thay thế chúng với '. Tôi chắc chắn rằng tất cả ? phải được thay thế mà không có ngoại lệ.

Tôi biết có một hàm thay thế nhưng tôi không thể biết cách trích xuất một ký tự từ một chuỗi trong sql.

Đây là một ví dụ tôi nhận được nhưng nó không thể giúp tôi.

UPDATE dbo.authors 

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

Bất kỳ ý tưởng nào?

+0

Bạn đang cố gắng cập nhật '?' Thành ''''? '''' là một chuỗi rỗng, giống hệt 'null' trong Oracle. – Ben

+0

Có thể trùng lặp của [Làm thế nào để thay thế các giá trị cụ thể trong một cột cơ sở dữ liệu oracle?] (Http://stackoverflow.com/questions/3443156/how-to-replace-specific-values-in-a-oracle-database-column) – Vadzim

Trả lời

16

bạn có chắc chắn rằng các dữ liệu được lưu trữ trong cơ sở dữ liệu thực sự là một dấu hỏi? Tôi sẽ có xu hướng nghi ngờ từ các dữ liệu mẫu rằng vấn đề là một trong những bộ ký tự chuyển đổi nơi ? đang được sử dụng như là nhân vật thay thế khi nhân vật không thể được đại diện trong bộ ký tự khách hàng. Có thể, cơ sở dữ liệu thực sự lưu trữ các ký tự "báo giá thông minh" của Microsoft thay vì các dấu nháy đơn giản.

Chương trình chức năng DUMP thực sự được lưu trữ trong cơ sở dữ liệu là gì?

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

Bạn đang sử dụng ứng dụng nào để xem dữ liệu? Cài đặt NLS_LANG của khách hàng là gì?

Cơ sở dữ liệu và bộ ký tự quốc gia là gì? Dữ liệu có được lưu trữ trong cột VARCHAR2 không? Hoặc NVARCHAR2?

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

Nếu tất cả các nhân vật vấn đề được lưu trữ trong cơ sở dữ liệu như 0x19 (thập phân 25), REPLACE bạn sẽ cần phải có một cái gì đó giống như

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

Điều đó có thể đúng. Tôi sẽ xem xét nó. Mặc dù tôi không biết NLS_LANG là gì. Dữ liệu được lưu trữ dưới dạng VARCHAR2 Cảm ơn – WowBow

+0

@Justin .. Tôi đã phát hiện ra rằng trong cơ sở dữ liệu. Nhân vật thậm chí còn không thể nhìn thấy ... nó là không gian trống rỗng. Bằng cách chạy phương thức kết xuất trên tên cột tôi đã tìm thấy điều này. >> Typ = 1 Len = 38 Ký tự = 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 . Có nghĩa là gì? Và khi nó được hiển thị nó thậm chí không phải là dấu chấm hỏi mà là một số ký tự có dây. Các ký tự có chứa một cái gì đó trông giống như 0019. – WowBow

+0

@WowBow - Đó là 'DUMP' tương ứng với dữ liệu mẫu bạn đã đăng (" Cha mẹ? CUI giả định bằng tổng của cha? S/cha mẹ? S và mẹ? S/stepmother? s thu nhập. ")? Hai người đó dường như không phù hợp. –

7

này sẽ thay thế tất cả ? với ':

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

Nếu bạn cần cập nhật nhiều hơn một cột, bạn có thể thay đổi city mỗi khi bạn thực hiện với một tên cột khác nhau, hoặc liệt kê các cột như vậy :

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

chúng ta không cần mệnh đề where? – WowBow

+0

@MatX - Một mệnh đề where sẽ lọc các hàng để nó chỉ kiểm tra những hàng cần cập nhật. Ưu điểm duy nhất là hiệu suất, nhưng nó là một điểm đáng giá. Tôi sẽ thêm nó vào truy vấn – Curt

+0

Oh ... làm thế nào về nếu tôi đang cập nhật nhiều hơn một cột .. tức là tôi sẽ có nhiều hơn một câu lệnh SET. Làm thế nào tôi nên viết mệnh đề where trong trường hợp đó bởi vì tôi đang xử lý nhiều hơn một cột? – WowBow

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

Sử dụng REPLACE chức năng.

ví dụ: SELECT REPLACE ('t? Es? T', '?', 'W');

Source

+1

Hai câu trả lời khác cũng nói như vậy. –

Các vấn đề liên quan