Udostępnij za pośrednictwem


Identyfikatory (Entity SQL)

Identyfikatory są używane w języku Entity SQL do reprezentowania aliasów wyrażeń zapytania, odwołań do zmiennych, właściwości obiektów, funkcji itd. Jednostka SQL udostępnia dwa rodzaje identyfikatorów: proste identyfikatory i identyfikatory cytowane.

Proste identyfikatory

Prosty identyfikator w języku Entity SQL to sekwencja znaków alfanumerycznych i podkreślenia. Pierwszy znak identyfikatora musi być znakiem alfabetycznym (a-z lub A-Z).

Identyfikatory cytowane

Identyfikator cytowany to dowolna sekwencja znaków ujęta w nawiasy kwadratowe ([]). Identyfikatory cytowane umożliwiają określenie identyfikatorów z znakami, które nie są prawidłowe w identyfikatorach. Wszystkie znaki między nawiasami kwadratowymi stają się częścią identyfikatora, w tym wszystkich białych znaków.

Identyfikator cytowany nie może zawierać następujących znaków:

  • Newline.

  • Powrotu karetki.

  • Karty.

  • Backspace.

  • Dodatkowe nawiasy kwadratowe (czyli nawiasy kwadratowe w nawiasach kwadratowych, które definiują identyfikator).

Identyfikator cytowany może zawierać znaki Unicode.

Identyfikatory cytowane umożliwiają tworzenie znaków nazw właściwości, które nie są prawidłowe w identyfikatorach, jak pokazano w poniższym przykładzie:

SELECT c.ContactName AS [Contact Name] FROM customers AS c

Można również użyć identyfikatorów cytowanych, aby określić identyfikator, który jest zastrzeżonym słowem kluczowym jednostki SQL. Jeśli na przykład typ Email ma właściwość o nazwie "From", możesz go uściślić z zastrzeżonego słowa kluczowego FROM przy użyciu nawiasów kwadratowych w następujący sposób:

SELECT e.[From] FROM emails AS e

Możesz użyć identyfikatora cytowanego po prawej stronie operatora kropki (.).

SELECT t FROM ts as t WHERE t.[property] == 2

Aby użyć nawiasu kwadratowego w identyfikatorze, dodaj dodatkowy nawias kwadratowy. W poniższym przykładzie "abc]" jest identyfikatorem:

SELECT t from ts as t WHERE t.[abc]]] == 2

Aby zapoznać się z semantyka porównania identyfikatorów cytowanych, zobacz Input Character Set (Zestaw znaków wejściowych).

Reguły aliasowania

Zalecamy określenie aliasów w zapytaniach Entity SQL zawsze, gdy jest to konieczne, w tym następujące konstrukcje Entity SQL:

  • Pola konstruktora wiersza.

  • Elementy w klauzuli FROM wyrażenia zapytania.

  • Elementy w klauzuli SELECT wyrażenia zapytania.

  • Elementy w klauzuli GROUP BY wyrażenia zapytania.

Prawidłowe aliasy

Prawidłowe aliasy w usłudze Entity SQL to dowolny prosty identyfikator lub identyfikator cytowany.

Generowanie aliasów

Jeśli w wyrażeniu zapytania Entity SQL nie określono aliasu, program Entity SQL próbuje wygenerować alias na podstawie następujących prostych reguł:

  • Jeśli wyrażenie zapytania (dla którego alias jest nieokreślony) jest prostym lub cytowanym identyfikatorem, ten identyfikator jest używany jako alias. Na przykład, ROW(a, [b]) staje się ROW(a AS a, [b] AS [b]).

  • Jeśli wyrażenie zapytania jest bardziej złożonym wyrażeniem, ale ostatnim składnikiem tego wyrażenia zapytania jest prosty identyfikator, ten identyfikator jest używany jako alias. Na przykład, ROW(a.a1, b.[b1]) staje się ROW(a.a1 AS a1, b.[b1] AS [b1]).

Zalecamy, aby nie używać aliasu niejawnego, jeśli chcesz później użyć nazwy aliasu. Za każdym razem, gdy aliasy (niejawne lub jawne) powodują konflikt lub są powtarzane w tym samym zakresie, wystąpi błąd kompilacji. Alias niejawny przekaże kompilację, nawet jeśli istnieje jawny lub niejawny alias o tej samej nazwie.

Aliasy niejawne są generowane automatycznie na podstawie danych wejściowych użytkownika. Na przykład następujący wiersz kodu wygeneruje ciąg NAME jako alias dla obu kolumn i w związku z tym będzie powodować konflikt.

SELECT product.NAME, person.NAME

Następujący wiersz kodu, który używa jawnych aliasów, również zakończy się niepowodzeniem. Jednak awaria będzie bardziej widoczna przez odczytanie kodu.

SELECT 1 AS X, 2 AS X …

Reguły określania zakresu

Język Entity SQL definiuje reguły określania zakresu, które określają, kiedy określone zmienne są widoczne w języku zapytań. Niektóre wyrażenia lub instrukcje wprowadzają nowe nazwy. Reguły określania zakresu określają, gdzie można używać tych nazw, oraz kiedy lub gdzie nowa deklaracja o takiej samej nazwie jak inna może ukryć swojego poprzednika.

Gdy nazwy są zdefiniowane w zapytaniu Entity SQL, mówi się, że mają być zdefiniowane w zakresie. Zakres obejmuje cały region zapytania. Wszystkie wyrażenia lub odwołania do nazw w określonym zakresie mogą wyświetlać nazwy zdefiniowane w tym zakresie. Przed rozpoczęciem zakresu i po jego zakończeniu nie można odwoływać się do nazw zdefiniowanych w zakresie.

Zakresy można zagnieżdżać. Części jednostki SQL wprowadzają nowe zakresy, które obejmują całe regiony, a te regiony mogą zawierać inne wyrażenia Języka SQL jednostki, które również wprowadzają zakresy. Gdy zakresy są zagnieżdżone, odwołania mogą być tworzone do nazw zdefiniowanych w najbardziej wewnętrznym zakresie, który zawiera odwołanie. Odwołania można również odwoływać do dowolnych nazw zdefiniowanych w dowolnych zakresach zewnętrznych. Wszystkie dwa zakresy zdefiniowane w tym samym zakresie są traktowane jako zakresy równorzędne. Nie można odwoływać się do nazw zdefiniowanych w zakresach równorzędnych.

Jeśli nazwa zadeklarowana w zakresie wewnętrznym jest zgodna z nazwą zadeklarowaną w zakresie zewnętrznym, odwołania w zakresie wewnętrznym lub w zakresach zadeklarowanych w tym zakresie odwołują się tylko do nowo zadeklarowanej nazwy. Nazwa w zakresie zewnętrznym jest ukryta.

Nawet w tym samym zakresie nie można odwoływać się do nazw przed ich zdefiniowaną definicją.

Nazwy globalne mogą istnieć w ramach środowiska wykonywania. Może to obejmować nazwy kolekcji trwałych lub zmiennych środowiskowych. Aby nazwa była globalna, musi być zadeklarowana w najbardziej zewnętrznym zakresie.

Parametry nie znajdują się w zakresie. Ponieważ odwołania do parametrów obejmują specjalną składnię, nazwy parametrów nigdy nie będą zderzać się z innymi nazwami w zapytaniu.

Wyrażenia kwerend

Wyrażenie zapytania Entity SQL wprowadza nowy zakres. Nazwy zdefiniowane w klauzuli FROM są wprowadzane do zakresu od w kolejności wyglądu od lewej do prawej. Na liście sprzężeń wyrażenia mogą odwoływać się do nazw zdefiniowanych wcześniej na liście. Właściwości publiczne (pola itd.) elementów zidentyfikowanych w klauzuli FROM nie są dodawane do zakresu od. Muszą one być zawsze przywołyne przez nazwę kwalifikowaną aliasem. Zazwyczaj wszystkie części wyrażenia SELECT są brane pod uwagę w zakresie od.

Klauzula GROUP BY wprowadza również nowy zakres elementów równorzędnych. Każda grupa może mieć nazwę grupy, która odwołuje się do kolekcji elementów w grupie. Każde wyrażenie grupowania spowoduje również wprowadzenie nowej nazwy do zakresu grupy. Ponadto agregacja zagnieżdżona (lub nazwana grupa) jest również dodawana do zakresu. Same wyrażenia grupowania znajdują się w zakresie od zakresu. Jednak gdy jest używana klauzula GROUP BY, klauzula select-list (projekcja), klauzula HAVING i klauzula ORDER BY są uważane za w zakresie grupy, a nie w zakresie od. Agregacje otrzymują specjalne leczenie, zgodnie z opisem na poniższej liście punktowanej.

Poniżej przedstawiono dodatkowe uwagi dotyczące zakresów:

  • Wybrana lista może wprowadzać nowe nazwy do zakresu w kolejności. Wyrażenia projekcji po prawej stronie mogą odwoływać się do nazw przewidywanych po lewej stronie.

  • Klauzula ORDER BY może odwoływać się do nazw (aliasów) określonych na liście wyboru.

  • Kolejność obliczania klauzul w wyrażeniu SELECT określa kolejność wprowadzonych nazw do zakresu. Klauzula FROM jest najpierw oceniana, a następnie klauzula WHERE, klauzula GROUP BY, klauzula HAVING, klauzula SELECT, a na koniec klauzula ORDER BY.

Obsługa agregacji

Jednostka SQL obsługuje dwie formy agregacji: agregacje oparte na kolekcji i agregacje oparte na grupach. Agregacje oparte na kolekcji są preferowaną konstrukcją w języku Entity SQL, a agregacje oparte na grupach są obsługiwane w celu zachowania zgodności z programem SQL.

Podczas rozpoznawania agregacji jednostka SQL najpierw próbuje traktować ją jako agregację opartą na kolekcji. Jeśli to się nie powiedzie, usługa Entity SQL przekształca zagregowane dane wejściowe w odwołanie do agregacji zagnieżdżenia i próbuje rozwiązać to nowe wyrażenie, jak pokazano w poniższym przykładzie.

AVG(t.c) becomes AVG(group..(t.c))

Zobacz też