Toán tử nối chuỗi trong Oracle là gì?


Câu trả lời:


236

Đó là ||, ví dụ:

select 'Mr ' || ename from emp;

Tính năng "thú vị" duy nhất tôi có thể nghĩ đến là 'x' || nulllợi nhuận 'x', không nullnhư bạn có thể mong đợi.


3
Tôi mong đợi null từ một hoạt động hợp lý ... không chắc chắn tôi đã từng nghĩ về một hoạt động chuỗi.

1
Tất nhiên, Oracle đối xử với null và '' giống nhau và 'x' || '' = 'x' có ý nghĩa. Nhưng nếu bạn nghĩ null là "không xác định" hoặc "không xác định" thì 'x' || null có thể là bất kỳ chuỗi nào bắt đầu bằng 'x' và do đó, chính nó là "không xác định"!
Tony Andrew

4
||trong Oracle không phải là một toán tử logic, do đó, 'x'||nulltrả về x.
Iľja

3
@ipip: Tôi bối rối - nếu bởi "toán tử logic", ý bạn là toán tử thích AND, NOTv.v ... thì tất nhiên đó ||không phải là toán tử logic. Nhưng điều đó có nghĩa là gì 'x'||nullkhi trở về x? n+nulltrả về null, vậy là +một toán tử logic?
Tony Andrew

2
Việc xử lý null của Oracle trong việc ghép nối là không chuẩn ở chỗ nó khác với thông số SQL92 (và Postgres) - xem postgresql.org/message-id/921.1144705646@sss.pgh.pa.us
beldaz

61

Cũng có concat, nhưng nó không được sử dụng nhiều

select concat('a','b') from dual;

6
Đây là cách tốt hơn so với | | Biểu tượng. sử dụng | | chỉ gây nhầm lẫn khi sử dụng ngôn ngữ khác | |.
jordan

17
Đồng ý cho rõ ràng, nhưng || có lợi thế cho phép dễ dàng hơn 2 lĩnh vực
Patrick Honorez

3
CONCATcũng tương thích với các DBMS khác (ít nhất là MySQL và Postgres).
lapo

1
Điều lạ lùng là nó đã không xảy ra với ủy ban SQL ANSI rằng bất kỳ ai cũng có thể cần phải kết hợp nhiều hơn hai điều. (Tương tự với các thiên tài tại Oracle, người đã nghĩ ra nvl().)
William Robertson

1
CONCATcũng có sẵn trong Microsoft SQL Server 2012 trở đi . CONCAT, mặc dù không đạt tiêu chuẩn, chắc chắn là cách tốt nhất nếu bạn muốn mã của mình có thể mang theo được. ( ||là toán tử tiêu chuẩn ANSI thực tế, mặc dù bạn sẽ không biết điều đó bằng cách xem hỗ trợ cho nó!)
Matt Gibson

11

Tôi sẽ đề nghị concat khi xử lý 2 chuỗi và || khi các chuỗi đó nhiều hơn 2:

select concat(a,b)
  from dual

hoặc là

  select 'a'||'b'||'c'||'d'
        from dual

2
xin lỗi tôi nhận ra đây là 2 năm trước, nhưng tại sao bạn lại thích concat(a,b)hơn a||b?
Tony Andrew

| | ngắn hơn, linh hoạt hơn, và đơn giản. Nhìn vào tuyên bố chọn của anh ấy.
JoshYates1980

6
DECLARE
     a      VARCHAR2(30);
     b      VARCHAR2(30);
     c      VARCHAR2(30);
 BEGIN
      a  := ' Abc '; 
      b  := ' def ';
      c  := a || b;
 DBMS_OUTPUT.PUT_LINE(c);  
   END;

đầu ra :: Abc def


1

Sử dụng CONCAT(CONCAT(,),)làm việc cho tôi khi nối nhiều hơn hai chuỗi.

Vấn đề của tôi bắt buộc phải làm việc với chuỗi ngày (chỉ) và tạo YYYYMMDDtừ YYYY-MM-DDnhư sau (nghĩa là không chuyển đổi sang định dạng ngày):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.