środa, 26 stycznia 2011

Jak zamenić " na \" w java za pomocą String.replaceAll()

Z kategorii tak dziwne, że aż śmieszne. Otóż zamiana " w String'u w Javie na \" może przysporzyć pewnych trudności.

Używając oferowanej przez String'a funckji: replaceAll(), zapisujemy:

String s = "Adam Mickewicz \"Pan Tadeusz\" ";
s = s.replaceAll("\"", "\\\"");

efekt - żaden. Taka operacja nic z naszym String'iem nie zrobi. Należy pamiętać, że pierwszy argument funkcji replaceAll, to wyrażenie regularne. Dlatego znak '\', musi być dodatkowo wyeskejpowany dla regexp'a, czyli dopiero:

s = s.replaceAll("\\\"", "\\\\\"");

robi to o co nam chodziło. Zapis iście komiczny, ale co zrobisz...

piątek, 21 stycznia 2011

Zamiana wierszy na kolumny w tabeli - crosstab (postgresql).

Jakiś czas temu musiałem, zrobić dość nieprzyjemną operacje na tabeli, tzn. zamienić wiersze tak aby tworzyły one kolumny. Czyli coś takiego:
 x f01 a

 x f02 b

 x f03 c
 y f01 a
 y f02 b

 z f01 a

 z f02 b
 z f03 c

 z f04 d
 z f05 e

miało zamienić się w coś takiego:

 id f01 f02 f03 f04 f05
 x a b c
 y a b
 z a b c d e

Generalnie rzecz niby prosta, ale dość nienaturalna dla tabel w bazce . W realnym przykładzie miałem tak de facto 20 kolumn, co wiązało by się z wykonaniem 20 JOIN-ów, na tabelach, które posiadać będą olbrzymią ilość danych.

W postgresie na szczęście znalazłem funkcję: crosstab, która umożliwia szybkie (?) wykonanie zapytania krzyżowego (typu PIVOT) i pięknie realizuje to, o co mi chodzi.

Zastanawiam się tylko jak jest ona zaimplementowana, i jaka jest jej wydajność, czy poradzi sobie z zakładaną dość dużą ilością danych? Ktoś coś wie na ten temat?