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

Odpowiedz Nowy wątek
2017-11-13 22:26

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

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?

Pozostało 580 znaków

2017-11-14 00:13

Rejestracja: 8 lat temu

Ostatnio: 41 minut temu

0

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Nic. Zapytanie powstało przez przypadek :) - Marcin.Miga 2017-11-14 08:22

Pozostało 580 znaków

2017-11-14 08:51

Rejestracja: 17 lat temu

Ostatnio: 58 minut temu

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...

Pozostało 580 znaków

Odpowiedz

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