Kas on mingit vahet selles osas, kui otsingutingimusse kirjutada IS TRUE või =TRUE?

Postitas Erki Eessaar 16.01.2024 19:00 (muudeti 18.01.2024 20:19)
Tegelikult ei ole. Teen väikese katsetuse PostgreSQLis (ver 16).

CREATE TABLE Bool_test (
bool_test_id SERIAL,
flag BOOLEAN NOT NULL,
CONSTRAINT pk_bool_test PRIMARY KEY (bool_test_id));
 
--Genereerin üks miljon rida juhuslike tõeväärtustega
INSERT INTO Bool_test (flag)
SELECT (round(random())::int)::boolean AS flag
FROM Generate_series(1, 1_000_000);
 
Loon indeksi, värskendan statistikat ja katsetan kahte päringut.
CREATE INDEX idx_bool_test_flag ON Bool_test(flag);
ANALYZE;
EXPLAIN ANALYZE SELECT Count(*) AS cnt FROM Bool_test WHERE flag IS TRUE;
EXPLAIN ANALYZE SELECT Count(*) AS cnt FROM Bool_test WHERE flag=TRUE;

Nendel päringutel pole PostgreSQLis vahet ei tulemuse ega kasutatud täitmisplaani seisukohalt. Mõlemate korral kasutatakse indeksit.

Vahelepõikena olu öeldud, et see, et tulemus on ühesugune, on erinev MySQList, kus BOOLEAN on sünonüüm andmetüübile TINYINT(1) e väikeste täisarvude tüübile, mis sisaldab täisarve vahemikus -9 kuni 9. MySQLi korral tähendab väärtus 0 selles veerus tõeväärtust FALSE, kõik ülejäänud väärtused tõeväärtust TRUE. MySQLi puhul leiab IS TRUE tingimusega päring kõik read, kus flag väärtus ei ole 0, samas kui =TRUE tingimus leiab vaid read, kus flag väärtus on 1.

Võimalik on ka selline kirjapilt

SELECT * FROM Bool_test WHERE flag;
 
Koodi ilmekuse seisukohalt mina sellist ei kasutaks.

Vahe tuleb sisse, kui Boolean tüüpi veerus on lubatud NULLid.
 
DROP TABLE Bool_test;
 
CREATE TABLE Bool_test (
bool_test_id SERIAL,
flag BOOLEAN,
CONSTRAINT pk_bool_test PRIMARY KEY (bool_test_id));
 
INSERT INTO Bool_test(flag) VALUES (TRUE),(FALSE),(NULL);
 
SELECT * FROM Bool_test WHERE flag IS NOT TRUE;
--Tulemuses kaks rida
 
SELECT * FROM Bool_test WHERE flag<>TRUE;
--Tulemuses üks rida, sest rida, kus flag on NULL, ei ole tulemuses.

NULL Boolean tüüpi veerus tähistab tõeväärtust UNKNOWN. Kui lubate NULLe Boolean tüüpi veerus, siis kasutate kolmevalentset loogikat (kolm võimalikku tõeväärtust - TRUE, FALSE ja UNKNOWN), mis on asjatu keerukuse kasvatamine. See on piisav põhjus, et deklareerida BOOLEAN tüüpi veergudele NOT NULL kitsendus.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!