sql >> Database >  >> RDS >> PostgreSQL

FOUT:functies in index-expressie moeten worden gemarkeerd als IMMUTABLE in Postgres

Volgens deze thread in de mailinglijst van hackers:

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

dit is bedoeld gedrag als to_char hangt af van de LC_MESSAGES-instelling

In jouw geval is dit blijkbaar niet logisch, aangezien het formaat dat je gebruikt nooit afhankelijk zal zijn van de landinstelling, dus als je de tekstrepresentatie in de index moet gebruiken, kun je je eigen to_char()-functie maken en deze markeren als onveranderlijk:

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;

Als je het als tekst in de index moet gebruiken (en de cast naar een datum niet kunt gebruiken zoals Sam suggereerde), moet je je eigen opmaakfunctie maken die je als onveranderlijk kunt markeren. Dat kan dan in de index worden gebruikt.

Maar om Postgres te laten gebruiken de index die je nodig hebt om my_to_char() . aan te roepen ook in uw SQL-instructies. Het zal het niet herkennen als je de ingebouwde to_char() . gebruikt

Maar ik denk dat Sam's suggestie om een ​​rechtstreekse datum in de index te gebruiken waarschijnlijk beter is



  1. MySQL IF()-functie uitgelegd

  2. Voeg meerdere rijen in SQLite-fout in (foutcode =1)

  3. Los het probleem met de SQL Server-database die vastzit in de verdachte modus op een efficiënte manier op

  4. Gratis veldhospitaaldatabase om de COVID-19-pandemie te bestrijden