sql >> Databasteknik >  >> RDS >> PostgreSQL

FEL:funktioner i indexuttryck måste markeras IMMUTABEL i Postgres

Enligt denna tråd i hackarnas e-postlista:

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

detta är avsett beteende som to_char beror på LC_MESSAGES-inställningen

I ditt fall är detta tydligen inte vettigt eftersom formatet du använder aldrig kommer att bero på språket, så om du behöver använda textrepresentationen i indexet kan du skapa din egen to_char()-funktion och markera den som oföränderlig:

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;

Om du måste använda den som en text i indexet (och inte kan använda casten till ett datum som Sam föreslog) måste du skapa din egen formateringsfunktion som du kan markera som oföränderlig. Det kan sedan användas i indexet.

Men för att få Postgres till användning indexet du behöver för att anropa my_to_char() i dina SQL-satser också. Den kommer inte att känna igen den när du använder den inbyggda to_char()

Men jag tror att Sams förslag att använda ett rakt datum i indexet förmodligen är bättre



  1. Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster

  2. Oracle-funktionsexempel för att få antal dagar mellan två datum

  3. JSON_MODIFY() Exempel i SQL Server (T-SQL)

  4. MySQL COALESCE() Förklarat