kann nvl() Funktion kaskadiert werden, ... wurde mir im IBM Interview gefragt ..... und warum ????Kann die NVL-Funktion kaskadiert werden?
Antwort
Noch besser wäre es, verwenden COALESCE
Ich stimme zu, Coalesce ist eine elegante Lösung für viele Situationen, wo mehrere NVL verwendet werden würde –
Ich denke, dass der Befragte nach der Antwort suchte, "Ja ... aber ich würde nur verwenden COALESCE stattdessen ... " – Eric
Ich erinnere mich, dass mir gesagt wurde, dass das zweite Argument für NVL immer ausgewertet wird, egal ob es benutzt wird oder nicht, was bei COALESCE nicht der Fall ist. Dies kann COALESCE in einigen Fällen zur leistungsstärkeren Option machen. –
Warum nicht? Zum Beispiel:
select NVL(null, NVL(null, 1)) from dual
kann es sein, so etwas wie:
select NVL(delete_date, NVL(edit_date, create_date)) AS last_change
from Table
Kann sein, sie wollten Sie sagen, dass es deterministische Funktion ist. Es ist also wiedereintretend.
Meine Antwort:
Ja, NVL kaskadiert werden. Es ist etwas, was ich auf Code sehen würde, der von Oracle-Versionen bis einschließlich 8i portiert wurde, weil COALESCE bis Oracle 9i nicht unterstützt wurde.
COALESCE ist ein ANSI SQL 99-Standard und funktioniert wie eine CASE/SWITCH-Anweisung in der Auswertung jedes Ausdrucks in der richtigen Reihenfolge und setzt die Auswertung von Ausdrücken nicht fort, wenn ein Nicht-Null-Ausdruck gefunden wird. Dies wird als Kurzschluss bezeichnet. Ein weiterer Vorteil der Verwendung von COALESCE ist, dass die Datentypen nicht übereinstimmen müssen, was bei der Verwendung von NVL erforderlich ist.
Dieses:
SELECT COALESCE(1.5/NULL,
SUM(NULL),
TO_CHAR(SYSDATE, 'YYYY')) abc
FROM DUAL
... kehrt: 2009
(für die nächsten ~ 32 Tage, sowieso)
Der häufigste Grund, dass ich für kaskadierte NVL die gesehen haben, ist, dass Datenbanken ändern sich im Laufe der Zeit. Das ursprüngliche Design hatte eine Tabelle, die später geändert wurde, um mehr Spalten in der Tabelle zu haben. Alter-Anweisungen erstellt die neuen Spalten als NULL erlaubt und dies wurde Vorteil mit View, so dass der Code oben nicht geändert werden musste. Das Problem war, dass eine einzige Spalte, change_date, durch mehrere Spalten ersetzt wurde. Update_Date, Comment_Date und Approval_date. Jede der 3 neuen Spalten kombinieren jetzt bekommt ein „CHANGE_DATE“ in der Ansicht mit
create or replace view OldTableNmae as
select other_columns
, nvl (update_date, nvl (comment_date, approval_date)) change_date
, more_columns
from new_table
/
Wie bereits gesagt, kann NVL kaskadiert werden, aber die bevorzugte Lösung wäre COALESCE zu verwenden, anstatt. Allerdings sind die beiden Funktionen nicht vollständig austauschbar:
1), wie an anderer Stelle erwähnt, COALESCE nur die Argumente aus dem ersten auswertet, bis es einen trifft, die nicht
2) jedoch auf null wertet, erfordert COALESCE alle Argumente vom gleichen Datentyp sein, also STRICTER als NVL, die zuerst eine implizite Konvertierung versuchen wird.
z.
SELECT COALESCE(1.5/NULL,
SUM(NULL),
TO_CHAR(SYSDATE, 'YYYY')) abc
FROM DUAL
wirft in der Tat den Fehler ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
NVL würde das aktuelle Jahr statt zurückkehren
SELECT NVL(1.5/NULL,
NVL(SUM(NULL),
TO_CHAR(SYSDATE, 'YYYY'))) abc
FROM DUAL
Weitere Beispiele:
select coalesce('some text',sysdate) from dual;
wirft ORA-00932: inconsistent datatypes: expected CHAR got DATE
, während
select nvl('some text',sysdate) from dual;
kehrt some text
, aber
select nvl(sysdate,'some text') from dual;
wirft ORA-01841: (full) year must be between -4713 and +9999, and not be 0
- 1. Wie kann ich prüfen, welche Objekte in Django kaskadiert werden?
- 2. SQLAlchemy löschen kaskadiert nicht
- 3. Wie kaskadiert man auf Softdeleten in Laravel4?
- 4. (C#) Ist SuspendLayout auf untergeordnete Steuerelemente kaskadiert?
- 5. NHibernate kaskadiert des löscht anderen Elternteil
- 6. Kaskadiert Makros in gcc C++ 14 vs msvC++ 2015
- 7. JPA mit JTA: entity Persist und verschmelzen kaskadiert Kind Einheiten
- 8. Wie man mehrere Regex-Anweisungen in Python präzise kaskadiert
- 9. Symfony: Wie kaskadiert man Undelete bei Verwendung der SoftDeleteable-Verhaltenserweiterung?
- 10. Kann die Bildschirmsitzung angezeigt werden?
- 11. Kann die Befehlsleiste festgelegt werden?
- 12. Wie kann die Klasse, die als Parameter in einer Methode verwendet werden kann, dynamisch definiert werden?
- 13. Die Datei 'SDL2.lib' kann nicht geöffnet werden. Die Datei 'ucrtrt.lib' kann nicht geöffnet werden.
- 14. Die Anmeldeseite kann nicht umgeleitet werden, wenn Benutzeranmeldeinformationen eingegeben werden
- 15. Kann Annotationsprozessor für die Codegenerierung verwendet werden?
- 16. Kann die Farbe eines Optionsfelds geändert werden?
- 17. Wie kann die Sammlung "Gruppe" entfernt werden?
- 18. Kann die Schriftartglättung in CSS deaktiviert werden?
- 19. Warum kann die Datei nicht gelöscht werden?
- 20. Kann die Python-Interpreter-Begrüßungsnachricht unterdrückt werden?
- 21. Kann die Breite einer UITableViewCell angepasst werden?
- 22. Wie kann die Canvas-Renderleistung verbessert werden?
- 23. Die Remote-Host kann nicht aufgelöst werden:
- 24. Kann die VM von MVVM wiederverwendet werden?
- 25. Wie kann die App-Leistung gesteigert werden?
- 26. Wie kann die Federvalidierung manuell ausgelöst werden?
- 27. Wie kann die Protokollierung ausgeklammert werden?
- 28. Wie kann die Countdown-Zeit aktualisiert werden?
- 29. Längste Kette, die arrangiert werden kann
- 30. Wie kann die TieredCompilation-Warnung ausgeblendet werden?
Sind wir reden über Oracle NVL-Funktion (weil die implizite Konvertierung Versuch von 'etwas Text' zu einem Zeitpunkt ausgefallen ist)? Und was meinen sie, wenn sie "kaskadiert" sagen? –
ja oracle nvl und cascade bedeutet nvl in nvl – hrishi