Notacja z podwójnym dwukropkiem (: :) w SQL

Odpowiedzi:

67

Różni się w zależności od RDBMS, ale jeśli zgaduję, jest to PostgreSQL, w którym to przypadku ::konwertuje a.dcsię na typ daty date.

W innych smakach ...

W MS SQL Server 2000:

W przypadku wbudowanych funkcji zdefiniowanych przez użytkownika, które zwracają tabelę, nazwa funkcji musi być określona z początkowym podwójnym dwukropkiem (: :), aby odróżnić ją od funkcji zdefiniowanych przez użytkownika, które nie są wbudowane. Musi być również określona jako jednoczęściowa nazwa bez bazy danych ani kwalifikacji właściciela. Na przykład: SELECT * FROM :: fn_helpcollations () b .. W przypadku wbudowanych funkcji zdefiniowanych przez użytkownika, które zwracają wartość skalarną, nazwa funkcji musi być określona jako jednoczęściowa (nie należy określać bazy danych ani właściciela). Nie określaj początkowego podwójnego dwukropka (: :).

W MS SQL Server 2005:

Dwukropki nie są już wymagane w przypadku funkcji UDF, które zwracają tabelę.

Jednak...

Dwukropki są wymagane w programie SQL Server 2005 podczas udzielania uprawnień do schematów, certyfikatów, punktów końcowych i kilku innych elementów zabezpieczających.

Jak również...

W przypadku korzystania z typów zdefiniowanych przez użytkownika statyczne metody tego typu muszą być wywoływane przy użyciu składni z podwójnym dwukropkiem.

Źródła: Blog BOL i Kalen Delaney

Michael Fredrickson
źródło
Natknąłem się na tę składnię używaną z UDF w praktycznym egzaminie SQL 2008 MCTS, nigdzie o niej nie wspomniano! Dzięki za wyjaśnienie
Sophia
27

W tym przypadku jest to rzut do typu daty. :: to rzutowanie typu, które może być również reprezentowane jako CAST (wyrażenie jako typ).

Michael Dean
źródło
Jeśli wiesz to na pewno, to może wiesz, do czego RDBMS służy ten skrypt?
Andriy M
Wydaje mi się, że PostgreSQL. Czy znasz jakieś alternatywy, które miałyby taką samą składnię?
Michael Dean
Znam niektóre RDBMS, które obsługują notację z podwójnym dwukropkiem, i znam inne, które mają tę INTERVALobsługę. To pierwszy fragment kodu, jaki kiedykolwiek widziałem, który łączy oba. Byłem tylko ciekawy. Dziękuję za odpowiedź.
Andriy M
15

To CASToperacja (rzutowanie na typ daty).

Przykład:

SELECT now()::timestamp(0);

Jest równa:

SELECT 
    CAST (now() AS timestamp(0));

Oba kończą now()się rzutowaniem do timestampw następującym formacie:YYYY-MM-DD HH:MM:SS

techkuz
źródło
Innym prostym przykładem może być:, select 1.2::integerco zwróci wynik jako 1.
themefield
0

To prawdopodobnie obsada, konwertowanie a.dcna typ date.

IBM Informix Dynamic Server (IDS) działałby w ten sposób - ale notacja INTERVAL na końcu nie jest poprawna dla IDS, więc przypuszczalnie jest to w rzeczywistości inny DBMS (prawdopodobnie PostgreSQL ).

Jonathan Leffler
źródło