2009-09-03 103 views
15

Có cách nào để có một toán tử chung để nối trong Oracle, Postgres và SQL Server không.Toán tử nối chuỗi trong Oracle, Postgres và SQL Server

Trong Oracle, chúng tôi sử dụng '|', postgres sử dụng '||' và máy chủ sql sử dụng '+'.

Tôi đã giải quyết được sự cố trong postgres bằng cách thêm toán tử tùy chỉnh '+' để hỗ trợ nối chuỗi.

Có cách nào để thêm cùng một toán tử trong Oracle để hỗ trợ nối chuỗi bằng cách sử dụng toán tử '+' hay không.

+0

tại sao tất cả cơ sở dữ liệu phải có cùng cú pháp? nếu tất cả đều giống nhau, thì sẽ chỉ có một. tất cả các ngôn ngữ ứng dụng đều có cú pháp khác nhau? –

+10

Tất cả các trình biên dịch C phân tách cú pháp giống nhau, tại sao các trình phân tích cú pháp SQL không làm như vậy? – ijw

+1

SQL Server và Sybase sử dụng ngôn ngữ TSQL và Oracle sử dụng ngôn ngữ PL/SQL. TSQL khác với PL/SQL. –

Trả lời

8

'||' chắc chắn hoạt động trong Oracle, mặc dù không rõ ràng là SQL Server. (Đối với những người đến sau chúng tôi, đây là một hòn đá Rosetta cho SQL: SQL Dialects Reference)

Nếu bạn đang sửa chữa lên kịch bản SQL, tôi sẽ xem xét các giải pháp sau đây:

TRƯỚC:

sql-shell-command < sql-file.sql 

(sql-file chứa '+' nhà khai thác)

SAU:

ansi-sql-shell-command < sql-file.sql 


sed -e 's/||/\+/' < sql-file.sql | ms-sql-shell-command 

(sql-file chứa các toán tử '||', bạn phải chuyển đổi tệp của mình)

Ý tưởng là bạn bắt đầu với SQL ở một định dạng, và trong trường hợp đặc biệt, bạn chạy bộ lọc qua nó chuyển nó sang định dạng khác. Về mặt lý thuyết, bạn có thể biến tất cả '+' es thành '||', nhưng vì một tỷ lệ tốt trong số đó có thể là số-thêm chứ không phải là chuỗi nối, điều đó cũng không có khả năng hoạt động.

Độ phức tạp của bộ lọc phụ thuộc vào những gì bạn đang làm. Nếu bạn có dữ liệu tùy ý trong SQL của bạn, thì bạn phải có nó để tránh thay thế bằng chuỗi. Nhưng nếu bạn đang thiết lập quan điểm thì có lẽ nó sẽ ổn.

Bạn có thể sử dụng kỹ thuật tương tự trong các chương trình trong đó SQL nằm trong chuỗi - viết một hàm trong chương trình để biến nó từ dạng này sang dạng khác.

+1

sẽ không hoạt động trên sql sever –

+0

Liên kết dường như không hoạt động ... = ( –

+1

@Will, afer chỉnh sửa của tôi, liên kết hoạt động ngay bây giờ –

20

Bạn không thể quá tải toán tử trong Oracle. "+" quá tải sẽ không hoạt động được, vì Oracle thực hiện chuyển đổi kiểu tự động ('1' + '1' = 2).

Toán tử ghép nối được Oracle sử dụng là ||, cũng tuân thủ ANSI.

Ngoài ra còn có chức năng CONCAT (như của postgres 9.0 và SQL Server 2012) được hỗ trợ bởi tất cả ba RDBMS bạn cần.

Lưu ý rằng phiên bản Oracle của CONCAT không phải là variadic giống hai phiên bản còn lại. Nếu bạn cần phải nối ba hoặc nhiều chuỗi bạn sẽ cần phải tổ:

CONCAT(s1,CONCAT(s2,s3)) 
+4

MySQL hỗ trợ hàm CONCAT() nhưng PostgreSQL và SQL Server thì không. Ít nhất, không phải ra khỏi hộp: – APC

+1

Vấn đề là dự án hiện tại của tôi sử dụng '+' làm toán tử nối chuỗi ở hầu hết các địa điểm. Nó hoạt động với cả máy chủ sql postgres. Bây giờ chúng tôi muốn dự án làm việc với oracle Đó là lý do tại sao tôi cần '+' để làm việc trong Oracle. Nếu nó không hoạt động thì chúng ta phải thay đổi hầu hết mã của chúng ta khi chúng ta sử dụng '+', cho toán tử chung '||' nếu nó hoạt động ở tất cả các nơi Tôi cần một giải pháp mà sẽ làm việc trong 3 cơ sở dữ liệu mà không có nhiều thay đổi trong hệ thống hiện có –

+1

Chức năng này cũng có sẵn trong PostgreSQL 9: http://www.postgresql.org/docs/9.1/static/functions-string.html – FGM

25

|| là các nhà điều hành nối SQL Standard (xem SQL 2008: 5,2). Sử dụng và khiếu nại nếu nó không hoạt động trong hệ thống bạn đang sử dụng ;-)

Nghiêm túc, bạn nên sử dụng các hệ thống khác ||, chứ không phải +.Nó không chỉ tiêu chuẩn hơn, mà còn vô tình gây nhầm lẫn nếu bạn sử dụng +, đặc biệt là nếu có bất kỳ loại nào được suy ra hoặc các phôi ngầm tiềm ẩn đang xảy ra.

xem xét: '5' + 2

Nếu hệ thống bạn đang sử dụng không ném một lỗi trên một đó, và + nghĩa cả cộng và nối, bạn có thể được in cho một số kết quả khó hiểu.

+3

Vì vậy, Microsoft không hỗ trợ tiêu chuẩn giống như mọi người khác, và anh ta nên khiếu nại với MS và yêu cầu họ thay đổi cách của họ. Vâng, điều đó sẽ hoạt động ... ;-) – ijw

+7

@ijw, Hoặc đơn giản là "nâng cấp" lên cơ sở dữ liệu tốt hơn :) – Cerin

+0

Khiếu nại ở đây: https://connect.microsoft.com/SQLServer/feedback/details/259291/support -iso-9075-tiêu chuẩn-chuỗi-nối-đôi-ống – codekaizen

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