Tôi muốn chọn một kết nối của một vài trường, nhưng với dấu tách giữa chúng. Dấu phân cách chỉ nên ở đó nếu cả hai toán hạng không phải là rỗng.Oracle: Concat với delimiter, nhưng chỉ khi cả hai toán hạng là NOT NULL
Vì vậy, để lưu bản ghi với a='foo', b=NULL, c='bar'
, tôi muốn nhận kết quả abc='foo;bar'
(không phải 'foo;;bar'
).
Tôi muốn có chức năng như concat_sep(a, b, ';')
chỉ thêm ';' inbetween nếu cả a và b không null.
Tất nhiên, tôi có thể sử dụng nvl2 như thế này:
select
a, b, c,
substr(abc, 1, length(abc) - 1) as abc
from
(select
a, b, c,
nvl2(a, a || ';', '') || nvl2(b, b || ';', '') || nvl2(c, c || ';', '') as abc
from
Table1)
Nhưng như bạn thấy, đoạn mã này trở thành sự bít lại sớm, đặc biệt là khi bạn có nhiều hơn 3 cột và bạn đã cho chúng những cái tên hợp lý thay vì của a, b và c. ;-)
Tôi không thể tìm thấy một cách ngắn hơn, dễ dàng hơn hoặc dễ đọc hơn, nhưng tôi nghĩ tôi sẽ hỏi ở đây trước khi từ bỏ hoàn toàn (hoặc lãng phí thời gian viết một hàm như vậy).
dường như logic y rất cụ thể Bạn muốn: tại sao viết chính chức năng của chính bạn là một sự lãng phí thời gian? – tbone
Nó sẽ là nếu có bật ra được một đã. :) – GolezTrol
mà không có 11g listagg trông giống như bạn S need cần phải viết của riêng bạn. Và nhìn nhận xét của bạn, có vẻ như bạn DID viết của riêng bạn, vì vậy tôi bối rối, bạn đang tìm kiếm một số chức năng chức năng của riêng bạn không cung cấp? Có lẽ một ví dụ về trường hợp sử dụng để xem cách bạn dự định sử dụng điều này (tôi có thể nghĩ ra một vài cách tiếp cận) – tbone