Marcin.Miga
2018-11-05 23:03

Ostatnio postgreSQL mnie zaskoczył... Pisałem o tym. Okazało się, że to nie błąd, a ficzer.
A że w bazach cały czas się uczę i eksperymentuję, to naukę z tamtego wpisu (dzięki @Panczo) postanowiłem wykorzystać.
Napisałem klasycznego "jednolinijkowca":

select string_agg(x, '') from  (select unnest(regexp_split_to_array('zażółć gęślą jaźń', E'\\s*')) x order by x) x

który wykorzystywał tę właściwosć (SELECT bez FROM)
Ale potem przypomniałem sobie, że w funkcjach agregujących w postgres można podać kolejność rekordów (dla SUM, AVG i podobnych zupełnie niepotrzebne, ale tu się przyda). I wyszedł jeszcze ładniejszy "jednolinijkowiec":

select string_agg(x, '' order by x) from  unnest(regexp_split_to_array('zażółć gęślą jaźń', E'\\s*')) x(x) 

A co on robi? Daje w wyniku aaąćęgjlłńóśzźż . Bez spacji - jeśli by miało być ze spacjami to trzeba zamenić E'\\s'* na E'\\.*'

Panczo

Jak widzę takie rzeczy to mam ochotę na przesiadkę na silnik Postgre ;)

cerrato

a ja jak widzę regexpy to mam ochotę wyjechać w Bieszczady :(

yarel

Mnie postsgres często zaskakuje w pozytywny sposób, select to_json(x.*) from tabelka x; albo hstore było miłym zaskoczeniem.

Marcin.Miga

A mnie zaskakuje tym, że select * from x order by * nie przechodzi, a select * from x order by x.* już tak :)

cerrato

@Marcin.Miga: może jest to celowe zabezpieczenie. Sama gwiazdka może być przypadkowo/błędnie wrzucona, ale x.* to już na 99% wynik celowego i świadomego działania. Trochę jak błąd, który czasem się przytrafia nawet najlepszym, czyli wpisanie = zamiast == w efekcie czego zamiast porównania masz przypisanie. I genialne w swojej prostocie zabezpieczenie stosowane w Pascalu: porównanie to = a przypisanie :=, przez co nie da się pomylić tych dwóch operatorów.

Panczo

@Marcin.Miga: a jak to działa? Na logikę jak mam tabelę z kolumnami a i b to select * from x order by x.* = selece a,b from x order by a,b?

Marcin.Miga

@cerrato: Myślę, że to jest jakiś ukryty cel... jeszcze nie wiem, jaki. Jest np. funkcja w postgreSQL, która również działa tylko z alias.*: SELECT row(x.*) from x

cerrato

Jak uda Ci się coś ustalić w tej sprawie to daj znać, bo sam jestem ciekawy, co się za tym kryje ;)