Co to jest operator konkatenacji ciągów w Oracle?

Odpowiedzi:

237

Jest to ||na przykład:

select 'Mr ' || ename from emp;

Jedyną „interesującą” funkcją, o której 'x' || nullprzychodzi mi do głowy 'x', jest to, że powraca , a nie nulltak, jak można by się spodziewać.

Tony Andrews
źródło
3
Oczekiwałbym wartości null od operacji logicznej ... nie jestem pewien, czy kiedykolwiek myślałem o operacji na łańcuchach.
1
Cóż, oczywiście Oracle traktuje null i „” jako to samo, a „x” || „” = „x” ma sens. Ale jeśli myślisz o null jako o „nieokreślonym” lub „nieznanym”, to „x” || null może być dowolnym łańcuchem zaczynającym się od „x”, więc samo w sobie jest „nieznane”!
Tony Andrews
4
||w Oracle nie jest operatorem logicznym, dlatego 'x'||nullzwraca x.
Iľja
3
@ipip: jestem mylić - jeśli przez „logiczne” operatora operatorów chodziło Ci się podoba AND, NOTitp wtedy oczywiście ||nie jest operator logiczny. Ale co to ma wspólnego z 'x'||nullpowrotem x? n+nullzwraca null, więc jest +operatorem logicznym?
Tony Andrews
2
Oracle obsługuje wartości null w konkatenacji, ponieważ różni się od specyfikacji SQL92 (i Postgres) - patrz postgresql.org/message-id/[email protected]
beldaz
61

Jest też concat, ale nie jest używany zbyt często

select concat('a','b') from dual;
Gary Myers
źródło
6
jest to o wiele lepsze niż || symbol. używając || jest po prostu mylące, jak w przypadku użycia ||.
jordan
17
Uzgodniono dla jasności, ale || ma tę zaletę, że z łatwością pozwala na więcej niż 2 pola
Patrick Honorez
3
CONCATjest również kompatybilny z innymi systemami DBMS (przynajmniej MySQL i Postgres).
lapo
1
Dziwne, że komitetowi ANSI SQL nie przyszło do głowy, że ktoś może potrzebować połączyć więcej niż dwie rzeczy. (To samo dotyczy geniuszy Oracle, którzy wymyślili nvl().)
William Robertson
1
CONCATjest również dostępny w Microsoft SQL Server 2012 i nowszych . CONCAT, choć niestandardowy, jest zdecydowanie najlepszym rozwiązaniem, jeśli chcesz, aby kod był przenośny. ( ||Jest rzeczywista średnia operator ANSI, choć nie wiem, to patrząc na wsparcie dla niego!)
Matt Gibson
11

Sugerowałbym konkatację, gdy mamy do czynienia z 2 ciągami i || kiedy te ciągi są większe niż 2:

select concat(a,b)
  from dual

lub

  select 'a'||'b'||'c'||'d'
        from dual
Fabio Fantoni
źródło
2
przepraszam, zdaję sobie sprawę, że to było 2 lata temu, ale dlaczego wolisz concat(a,b)więcej a||b?
Tony Andrews
|| krótszy, bardziej elastyczny i prosty. Spójrz na jego wybrane oświadczenie.
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;

wyjście :: Abc def

Ankur
źródło
1

Używanie CONCAT(CONCAT(,),)działało w przypadku łączenia więcej niż dwóch ciągów.

Mój problem wymagał pracy z ciągami daty (tylko) i tworzenia YYYYMMDDz YYYY-MM-DDnastępujących (tj. Bez konwersji do formatu daty):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Grant Shannon
źródło