Operatori di concatenazione nelle espressioni

Quando due operandi stringa vengono concatenati, il risultato dell'espressione è una stringa.

Gli operandi della concatenazione devono essere stringhe compatibili. Una stringa binaria non può essere concatenata con una stringa di caratteri, incluse le stringhe di caratteri definite come FOR BIT DATA (per ulteriori informazioni sulla compatibilità dei tipi di dati, consultare la matrice di compatibilità nella Tabella 1 ). Un tipo distinto basato su un tipo stringa può essere concatenato solo se viene creata un'apposita funzione definita dall'utente.

Sia CONCAT che le barre verticali (||) rappresentano l'operatore di concatenazione. Le barre verticali (o i caratteri che devono essere utilizzati al posto delle barre verticali in alcuni paesi1) possono causare errori di analisi nelle istruzioni passate da un DBMS a un altro. Il problema si verifica se l'istruzione subisce una conversione di caratteri con determinate combinazioni di CCSID1 di origine e di destinazione. Pertanto, CONCAT è l'operatore di concatenazione preferibile.

Se uno dei due operandi può essere nullo, il risultato può essere nullo e se uno dei due è nullo, il risultato è il valore nullo. Altrimenti, il risultato è costituito dalla stringa del primo operando seguita dal secondo.

La tabella seguente mostra come gli operandi stringa determinano il tipo di dati e l'attributo di lunghezza del risultato (l'ordine in cui gli operandi sono concatenati non ha alcun effetto sul risultato).
Tabella 1. Tipo di dati e lunghezza degli operandi concatenati
Se una colonna di operandi dell'
e è
E l'altro operando dell'
e è
Il tipo di dati della colonna dei risultati è 1
CHAR( x ) CHAR(y) con un attributo di lunghezza combinata inferiore a 256 CARATTERE( x + y ) 2
CHAR(y) con un attributo di lunghezza combinata superiore a 255 VARCHAR(MIN( x '+ y ', 32764 )) 3
VARCHAR( y )
VAR CHAR(x) VARCHAR( y ) VARCHAR(MIN( x '+ y ', 32764 )) 3
CLOB(x ) CHAR(y) CLOB(MIN( x '+ y ',2G))
VARCHAR( y )
CLOB(y )
GRAFICO(y) DBCLOB(MIN( x + y,1G))
VARGRAPHIC( y )
DBCL OB (y)
GRAFICO(x) CHAR(y) VARGRAFICO(MIN( x + y, 16382 )) 4
VARCHAR( y )
VARGRAPHIC( y )
VARGRAPHIC( x ) CHAR(y) VARGRAFICO(MIN( x + y, 16382 )) 4
VARCHAR( y )
GRAFICO(y)
GRAFICO(y)
DBCL OB (x) CHAR(y) DBCLOB(MIN( x + y,1G))
VARCHAR( y )
CLOB(y )
GRAFICO(y)
VARGRAPHIC( y )
DBCL OB (y)
BINARIO(x ) BINARIO(y) con un attributo di lunghezza combinata inferiore a 256 BINARIO( x + y )
BINARIO(y) con un attributo di lunghezza combinata superiore a 255 VARBINARIO( MIN (x+y,32764 ))
VARBINARIO(x ) VARB IN ARIO(y) VARBINARIO( MIN (x+y,32764 ))
BINARIO(y )
BLOB( x ) BLOB(y) BLOB(MIN( x + y, 2G ))
Note:
    • 2G rappresenta 2.147.483.647 byte
    • 1G rappresenta 1.073.741.823 caratteri a doppio byte
  1. CHAR(x)CHAR(y) possono contenere dati misti. Se uno dei due operandi contiene dati misti, il risultato è VAR CHAR (MIN(x'+ y',32764 )).
  2. Se è necessaria la conversione del primo operando, x' = 3x; altrimenti, rimane x. Se è necessaria la conversione del secondo operando, y'= 3y; altrimenti, rimane y.
  3. Entrambi gli operandi vengono convertiti in UTF-16, se necessario (ovvero, se l'operando non è già UTF-16 ), e i risultati vengono concatenati.

Come mostra la tabella precedente, la lunghezza del risultato è la somma delle lunghezze degli operandi. Tuttavia, la lunghezza del risultato è di due byte in meno se i caratteri ridondanti del codice di spostamento vengono eliminati dal risultato. I caratteri di codice di spostamento ridondanti esistono quando entrambe le stringhe di caratteri sono dati misti EBCDIC e la prima stringa termina con un carattere di spostamento in ( X'0F' ) e il secondo operando inizia con un carattere di shift-out ( X'0E' ). Questi due caratteri di codice turno vengono rimossi dal risultato.

Il CCSID del risultato è determinato dalle regole stabilite in Conversione dei caratteri nelle operazioni di set e concatenazioni. Alcune conseguenze di queste regole sono le seguenti:

  • Se uno dei due operandi è un dato BIT, il risultato è un dato BIT.
  • La conversione che si verifica quando i dati SBCS vengono confrontati con dati misti dipende dallo schema di codifica. Se lo schema di codifica è Unicode, l'operando SBCS viene convertito in MIXED. Altrimenti, la conversione dipende dal campo MIXED DATA sul pannello di installazione DSNTIPF per l' Db2 e che effettua il confronto:
    • Dati misti se l'opzione DATI MISTI sul server è SÌ. Il risultato non è necessariamente un insieme di dati ben formati.
    • Dati SBCS se l'opzione DATI MISTI sul server è NO. Se i dati misti non possono essere convertiti in dati SBCS puri, si verifica un errore.

Se un operando è una stringa da una colonna con una procedura di campo, l'operazione si applica alla forma decodificata del valore. Il risultato non eredita la procedura di campo.

Un operando di concatenazione può essere un marcatore di parametro. Quando un operando è un marcatore di parametro, il suo tipo di dati e gli attributi di lunghezza sono considerati uguali a quelli dell'operando che non è un marcatore di parametro, tranne che per un tipo di dati stringa. Fare riferimento alla Tabella 1 per la formula utilizzata per calcolare la lunghezza del tipo di dati per i marcatori di parametri non tipizzati nell'operatore CONCAT quando un altro operando è un tipo di dati stringa. L'ordine delle operazioni di concatenazione deve essere considerato per determinare questi attributi nel caso di concatenazione nidificata.

Nessun operando di concatenazione può essere di tipo distinto, anche se il tipo distinto è basato su un tipo di dati carattere. Per concatenare un tipo distinto, creare una funzione definita dall'utente che viene eseguita sull'operatore CONCAT. Ad esempio, se i tipi distinti TITLE e TITLE_DESCRIPTION fossero entrambi basati sul tipo di dati VARCHAR(25), la seguente funzione definita dall'utente, denominata ATTACH, potrebbe essere utilizzata per concatenare i due tipi distinti:
   CREATE FUNCTION ATTACH (TITLE, TITLE_DESCRIPTION)
      RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
In alternativa, l'operatore di concatenazione potrebbe essere sovraccaricato utilizzando una funzione definita dall'utente per aggiungere i tipi distinti:
   CREATE FUNCTION "||" (TITLE, TITLE_DESCRIPTION)
      RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
1 In varie pagine di codice EBCDIC, Db2 supporta le combinazioni di punti di codice X'4F4F', X'BBBB' e X'5A5A' per indicare la concatenazione. X'BBBB' e X'5A5A' sono interpretati come concatenazione solo su sottosistemi Db2 di set di caratteri a byte singolo. X'BBBB' è una coppia di caratteri di parentesi destra (']]') in alcune pagine di codice EBCDIC e non viene utilizzato come operatore di concatenazione quando compare in un'espressione di indice di matrice. Considera l'utilizzo di CONCAT come operatore di concatenazione al posto di X'BBBB', perché X'BBBB' potrebbe essere confuso con le parentesi quadre in un'espressione di indice di matrice.