2009-01-02 32 views
11

Chúng tôi có một bảng có cột varchar2(100), đôi khi có chứa dòng vận chuyển trả về & dòng nguồn cấp dữ liệu. Chúng ta nên loại bỏ các ký tự đó trong truy vấn SQL. Chúng tôi đang sử dụng:Chức năng Oracle REPLACE() không xử lý vận chuyển trả về và dòng nguồn cấp dữ liệu

REPLACE(col_name, CHR(10)) 

trong đó có không có tác dụng, tuy nhiên thay thế 'CHR (10) cho một nhân vật 'chữ' thường hơn chứng tỏ rằng REPLACE chức năng làm việc khác. Chúng tôi cũng đã phát hiện ra rằng

REPLACE(col_name, CHR(10), '_') 

tìm vị trí của mới-line, nhưng chèn gạch dưới sau nó, chứ không phải thay thế nó.

Chạy trên Oracle8i. Nâng cấp không phải là một tùy chọn.

Trả lời

31

Một cách khác là sử dụng TRANSLATE:

TRANSLATE (col_name, 'x'||CHR(10)||CHR(13), 'x') 

Các 'x' là bất kỳ ký tự mà bạn không muốn dịch sang null, vì TRANSLATE không hoạt động đúng nếu Tham số thứ 3 là null.

+0

Bạn có thể giải thích chi tiết phần ''x'' của mã? Tôi không đi theo. Tôi hiểu rằng bạn cần phải chỉ định một sự thay thế, nhưng tại sao bạn cần phải bao gồm sự thay thế ở đầu của đối số thứ hai? –

+1

Nếu bạn viết 'TRANSLATE (col_name, CHR (10) || CHR (13), null)' thì nó sẽ không hoạt động - nó sẽ luôn trả về NULL (một quirk của null xử lý). Nếu bạn viết 'TRANSLATE (col_name, CHR (10) || CHR (13), 'x')' thì nó sẽ chuyển đổi mỗi chữ cái CHR (10) thành 'x', không phải là thứ mong muốn. Nếu chúng ta đặt trước cả hai đối số bằng dấu 'x' thì nó sẽ dịch 'x' thành 'x' và CHR (10), CHR (13) thành null, cho kết quả mong muốn. –

+0

Gotcha, do đó, đó là những gì phần này của tài liệu tham khảo có nghĩa là 'Trong trường hợp này, các ký tự phụ ở cuối from_string không có ký tự tương ứng trong to_string. Nếu những ký tự thừa này xuất hiện trong char, thì chúng sẽ bị xóa khỏi giá trị trả về.' Cảm ơn! –

12

Bạn có chắc chắn dòng mới của mình không phải là CHR(13) + CHR(10), trong trường hợp này, bạn sắp kết thúc với CHR(13) + '_', có thể vẫn trông giống như một dòng mới?

Hãy thử REPLACE(col_name, CHR(13) + CHR(10), '')

+0

Cảm ơn điều này, nó thực sự đã giúp tôi. Tôi đã phải xuất một số nội dung cơ sở dữ liệu sang một hệ thống bên ngoài, bằng cách sử dụng một CSV (tôi đã không chọn này ...), và tôi muốn chuyển đổi trở về vận chuyển thành một dấu chấm đơn giản. Chỉ muốn thêm rằng tôi đã có một lỗi cú pháp với dấu "+" và phải thay thế bằng "||" như thế này: 'REPLACE (col_name, CHR (13) || CHR (10), '')' –

5

Nếu dữ liệu trong cơ sở dữ liệu của bạn được đăng tải từ HTML điều khiển biểu mẫu TextArea, các trình duyệt khác nhau sử dụng khác nhau nhân vật New Line:

Firefox tách dòng với CHR (10) chỉ

Internet Trình khám phá phân tách các dòng có chữ cái CHR (13) + CHR (10)

Apple (trước OSX) tách dòng với CHR (13) chỉ

Vì vậy, bạn có thể cần một cái gì đó như:

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '') 
15

Ahah! Cade là tiền.

Tạo phẩm trong TOAD in \r\n dưới dạng hai ký tự "blob" giữ chỗ, nhưng in một \r cũng là hai trình giữ chỗ. Bước 1 hướng tới một giải pháp là sử dụng ..

REPLACE(col_name, CHR(13) || CHR(10)) 

.. nhưng tôi chọn cho mạnh mẽ hơn một chút ..

REPLACE(REPLACE(col_name, CHR(10)), CHR(13)) 

.. mà bắt xúc phạm nhân vật trong bất kỳ thứ tự. Rất cám ơn Cade.

M.

+0

Hàm DUMP() là một cách hay để kiểm tra nội dung thực của cột trong trường hợp nghi ngờ –

0

Nếu ký tự dòng mới của bạn là CRLF, điều đó có nghĩa là đây là CHR(13), tiếp theo là CHR(10). Nếu bạn REPLACE(input, CHR(10), '_'), biến thành CHR(13), theo sau là dấu gạch dưới.Bởi vì CR riêng của nó cũng có thể được hiển thị dưới dạng ký tự mới, nó sẽ xuất hiện với bạn như thể dấu gạch dưới đã được chèn sau dòng mới của bạn, nhưng thực sự là chỉ một nửa dòng mới của bạn đã được thay thế.

Sử dụng REPLACE(REPLACE(input, CHR(13)), CHR(10)) để thay thế tất cả CRLF của.

1

Chỉ muốn bỏ ghi chú. Tôi đã gặp sự cố khi định dạng trường văn bản 4000 có ý tưởng riêng và văn bản dường như được bọc (hoặc không được quấn) một cách ngẫu nhiên trên báo cáo. Khi tôi cập nhật cột bằng cách sử dụng chr thay thế (10) đã lưu ý ở trên. Báo cáo của tôi cuối cùng được định dạng như tôi muốn. Nhiều Thanx!

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