PostgreSQL-Array-Indizes so anpassen, dass sie bei 1 beginnen
Die Flexibilität von PostgreSQL ermöglicht Arrays mit Indizes, die nicht bei der Standard-1 beginnen. Beispielsweise werden die Elemente des folgenden Arrays von 5 bis 7 indiziert:
<code class="language-sql">SELECT '[5:7]={1,2,3}'::int[];</code>
Der Zugriff auf das erste Element erfordert die Verwendung von Index 5:
<code class="language-sql">SELECT ('[5:7]={1,2,3}'::int[])[5];</code>
Viele Benutzer bevorzugen jedoch Arrays mit Indizes, die bei 1 beginnen. So erreichen Sie dies:
<code class="language-sql">SELECT ('[5:7]={1,2,3}'::int[])[array_lower('[5:7]={1,2,3}'::int[], 1):array_upper('[5:7]={1,2,3}'::int[], 1)];</code>
Dadurch wird das Array-Slice vom niedrigsten zum höchsten Index extrahiert, wodurch die Indizierung effektiv zurückgesetzt wird.
Ein besser lesbarer Ansatz mit einem Common Table Expression (CTE):
<code class="language-sql">WITH cte(a) AS (SELECT '[5:7]={1,2,3}'::int[]) SELECT a[array_lower(a, 1):array_upper(a, 1)] FROM cte;</code>
Für PostgreSQL 9.6 und höher gibt es eine vereinfachte Methode: Weglassen der Unter- und Obergrenzen in der Slice-Spezifikation:
<code class="language-sql">SELECT my_arr[:];</code>
In unserem Beispiel verbessern Klammern die Lesbarkeit:
<code class="language-sql">SELECT ( '[5:7]={1,2,3}'::int[] )[:];</code>
Dieser Ansatz ist effizient und funktioniert auch in Postgres-Versionen vor 9.6 gut.
Das obige ist der detaillierte Inhalt vonWie normalisiere ich PostgreSQL-Array-Indizes so, dass sie bei 1 beginnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!