PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

BŁĄD:funkcje w wyrażeniu indeksu muszą być oznaczone jako IMMUTABLE w Postgresie

Według tego wątku na liście dyskusyjnej hakerów:

http://www.mail-archive.com/[email protected]/msg86725.html

jest to zamierzone zachowanie jak to_char zależy od ustawienia LC_MESSAGES

W twoim przypadku najwyraźniej nie ma to sensu, ponieważ używany format nigdy nie będzie zależał od ustawień regionalnych, więc jeśli potrzebujesz użyć reprezentacji tekstowej w indeksie, możesz utworzyć własną funkcję to_char() i oznaczyć ją jako niezmienne:

CREATE OR REPLACE FUNCTION my_to_char(some_time timestamp) 
  RETURNS text
AS
$BODY$
    select to_char($1, 'yyyy-mm-dd');
$BODY$
LANGUAGE sql
IMMUTABLE;

Jeśli musisz użyć go jako tekstu w indeksie (i nie możesz użyć rzutowania na datę, jak sugerował Sam), będziesz musiał utworzyć własną funkcję formatowania, którą możesz oznaczyć jako niezmienną. To może być następnie użyte w indeksie.

Ale żeby Postgres używał indeks, który będziesz musiał wywołać my_to_char() również w instrukcjach SQL. Nie rozpozna go, gdy użyjesz wbudowanej funkcji to_char()

Myślę jednak, że sugestia Sama, aby użyć prostej daty w indeksie, jest prawdopodobnie lepsza



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać min/max dwóch liczb całkowitych w Postgres/SQL?

  2. SELECT DISTINCT jest wolniejszy niż oczekiwano na moim stole w PostgreSQL

  3. Wstawianie tablicy za pomocą gem Sequel w PostgreSQL

  4. postgresql COUNT(DISTINCT...) bardzo wolno

  5. Programowo wyprodukuj obiekt `DataSource` dla Postgres JDBC