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.
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
@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. –
@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