Zapytanie, które mnie zadziwiło... :)

3

Widziałem wiele w BD. Rzeczy dobre, rzeczy złe, rzeczy dziwne.
Ostatnio zadziwiło mnie jedno zapytanie, i to w postgreSQL-u.
Z tego co wiem, to zapytanie to nie działa na każdej konfiguracji postgreSQL-a (na jednym "naszym" serwerze nie działa, i to nie zalezy od numeru wersji). Na SQLFiddle działa. Znaczy się doczytałem w dokumentacji, że od wersji 9.4
Ale do rzeczy. Zawsze wydawało mi się, że Count(*) zwraca liczbę nie-nullowych elementów. Ale nie dotyczy to rekordów. Nawet jeśli cały rekord jest nullowy, to jest liczony. A co gdy rekordu nie ma?
W przykładzie jest to zapytanie:

SELECT Count(*) FROM (select) x;

sam

SELECT

zwraca coś, co postgreSQL uważa za rekord... ale dlaczego?
W sumie powinno to być w mikroblogu, ale może wy macie jakieś dziwne dla was zapytania?

0

aż się boję zapytać, gdzie takie coś znalazłeś i co to miało na celu.

0

Aż sprawdziłem wg. nowości w wersji 9.4

Allow SELECT to have an empty target list (Tom Lane)
This was added so that views that select from a table with zero columns can be dumped and restored correctly.

Czyli używanie tego w kontekście który przedstawiłeś mija się z celem, bo tak działa zgodnie z oczekiwaniami:

create table test();

select count(*) from test

http://sqlfiddle.com/#!17/85dff/1

Twój przykład bardziej pasuje mi do takiego scenariusza:

CREATE TABLE test (kol INTEGER NULL);

INSERT INTO test(kol) VALUES (null);

ALTER TABLE test
        DROP COLUMN kol;

Wtedy count(*) zwraca 1
http://sqlfiddle.com/#!17/766df/2

To tylko moje domysły, na zasadzie że select 1 na wszystkich znanych mi silnikach zwróci rekord z jedynką, znaczy nieistotne co zwróci, ale zawsze to będzie rekord...

Bardziej w tym wpisie zdziwiło mnie, że da się zrobić tabelę bez kolumn...

1 użytkowników online, w tym zalogowanych: 0, gości: 1