2015-11-24 15 views
5

Ok, questa è forse una stranezza del parser Oracle.Perché il segno più (+) prima di un valore stringa accettato in Oracle?

La seguente query funziona. Nota il + prima di 'Y' sull'ultima riga.

SELECT * 
    FROM (SELECT 'Y' AS field FROM DUAL 
     UNION ALL 
     SELECT 'X' AS field FROM DUAL) t 
WHERE t.field = +'Y' 

Perché il parser Oracle accetta questo? Per un secondo ho pensato che fosse dovuto alla vecchia sintassi del join esterno, ma in quella sintassi il + è circondato da parentesi.

Questo funziona così:

select +'Y1' from dual; 

e questo:

select 'A' || + 'Y1' from dual; 

Funziona (oracolo converte la stringa in numero):

select -'1' from DUAL; 

ma non questo ([ Errore] Esecuzione (223: 9): ORA-01722: numero non valido ):

select -'A' from DUAL; 

Mi chiedo perché il + può essere utilizzato prima di un valore varchar2. La sezione Arithmetic Operators non menziona regole specifiche applicabili ai valori stringa.

+0

Divertente. Il parser solo analizza quindi non considera i tipi di dati e + è un'espressione valida. Potrebbe essere anche l'ottimizzazione che viene applicata perché unario + non modifica l'espressione e può essere ottimizzato. Basta selezionare 'SELECT - - 1 FROM DUAL' e questo è grammaticalmente scorretto anche se matematicamente è corretto. – Husqvik

+0

@Husqvik, è divertente. La pagina degli Operatori di aritmetica OP link ha un avvertimento contro '--' per la doppia negazione, perché questo avvia un commento. Dice di separarsi con uno spazio o un paren. –

+0

@Husqvik: Quando ho detto parser intendevo veramente l'intero stack, parser, compilatore, ottimizzatore, ecc. Sì + è valido. Avrei pensato selezionare - -1 da lavori doppi. - - 1 è valido in C#, javascript e java ma non in scala. – costa

risposta

5

Il + operatore unario è definito come identità Vedere la Table 4-1 "SQL Operator Precedence" in About SQL Operators.

anche:

select + date '2015-01-01' from dual; 

gennaio 01 2015 00:00:00


A cura di aggiungere.

"Identità" sta per restituire la sua argomentazione. Per un altro esempio tratto da una lingua diversa, vedere la funzione identity di Clojure. Wikipedia ha una pagina per "identity function".

+1

Cosa significa identità in questo contesto? – costa