Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird embedded - Fehler bei coalesce (https://www.delphipraxis.net/175349-firebird-embedded-fehler-bei-coalesce.html)

Neutral General 14. Jun 2013 11:56

Datenbank: Firebird embedded (Win32) • Version: 2.5.2 • Zugriff über: IBX / IBExpert

Firebird embedded - Fehler bei coalesce
 
Hallo,

Ich habe folgende SQL:

SQL-Code:
SELECT
  keyword_entry.entry_type,
  text_lng.string as titel,
  keyword_entry.entry_value
FROM keyword
JOIN keyword_entry on (keyword_entry.keyword_id = keyword.id)
LEFT JOIN keyword_synonym on (keyword_synonym.keyword_id = keyword.id)
LEFT JOIN text on (text.id = keyword_entry.titel_text_id)
LEFT JOIN text_lng on (text_lng.text_id = text.id) and (text_lng.lng_id = :lng_id )
WHERE (coalesce(keyword_synonym.name, keyword.name, "") = lower(:keyword))
Wenn ich diese SQL in Delphi in eine IBQuery stecke und die Query öffne erhalte ich:

Zitat:

---------------------------
Programm
---------------------------
Unbekannter SQL-Datentyp (0)
---------------------------
OK
---------------------------
In IBExpert bekomme ich folgende Meldung:

Zitat:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
Wenn ich das coalesce aus dem Code rausnehme, dann funktionierts bei beiden.
Woran liegt das?

Morphie 14. Jun 2013 12:09

AW: Firebird embedded - Fehler bei coalesce
 
Also erst mal als Hinweis: es ist immer schlecht, eine Spalte "Name" zu nennen...
Doch das ist wohl nicht dein Fehler... Ich denke der Fehler liegt einfach an den Anführungszeichen. Probiere mal einfache Anführungszeichen:
Code:
SELECT
  keyword_entry.entry_type,
  text_lng.string as titel,
  keyword_entry.entry_value
FROM keyword
JOIN keyword_entry on (keyword_entry.keyword_id = keyword.id)
LEFT JOIN keyword_synonym on (keyword_synonym.keyword_id = keyword.id)
LEFT JOIN text on (text.id = keyword_entry.titel_text_id)
LEFT JOIN text_lng on (text_lng.text_id = text.id) and (text_lng.lng_id = :lng_id )
WHERE (coalesce(keyword_synonym.name, keyword.name, '') = lower(:keyword))

Neutral General 14. Jun 2013 12:13

AW: Firebird embedded - Fehler bei coalesce
 
Hallo,

Warum ist es schlecht ein Feld "Name" zu nennen? (In Delphi kann ichs noch eher verstehen)
Ich hätte es niemals geglaubt aber mit den anderen Anführungszeichen geht es tatsächlich...
Das ist sehr seltsam weil ich auf der Arbeit auch Firebird benutze und es dort noch NIE einen Unterschied gemacht hat ob man '' oder "" benutzt hat :gruebel:
Der einzige Unterschied ist dass wir dort eine Dialect 1 Datenbank haben und ich privat Dialect 3 benutze. Kann es das sein?

Danke auf jeden Fall :)

Morphie 14. Jun 2013 12:21

AW: Firebird embedded - Fehler bei coalesce
 
Naja, es gibt reservierte Wörter, die man möglichst nicht als Spaltennamen verwenden sollte...
"Name" gehört zwar (noch) nicht dazu, aber bei anderen Datenbanksystemen ist "Name" mittlerweile schon reserviert (z.B. Oracle)
Wenn du also mal irgendwann die Datenbank wechseln möchtest, hast du hier ein Problem.

Man kann allerdings auch reservierte Wörter verwenden, dann muss man diese in Anführungszeichen setzen.
Ist eine Spalte also in Anführungszeichen gesetzt, wird der Spaltenname einfach so übernommen, auch wenn sich dahinter "normalerweise" z.B. eine Procedure oder ein reservierter Name verbirgt.
Und genau das hat bei dir jetzt diesen Fehler verursacht. Im Prinzip gab es die Spalte "" nicht.

Ob das bei Dialect 1 anders ist, kann ich dir nicht sagen, ich verwende nur Dialect 3.

Neutral General 14. Jun 2013 12:57

AW: Firebird embedded - Fehler bei coalesce
 
Okay, die Begründung mit den Anführungszeichen ist nachvollziehbar.
Es scheint als wäre Dialect 3 generell etwas strenger. In Dialect 1 geht z.B. folgendes ohne Probleme:

SQL-Code:
SELECT
  lkz.lkz
FROM lkz

IBExpert 14. Jun 2013 22:43

AW: Firebird embedded - Fehler bei coalesce
 
nimm einfache Anfürungszeichen für Stringkonstanten und DIalekt 3, Dialekt 1 ist evtl demnächst nicht mehr verfügbar


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz