Kuidas konkateneerida MS Accessis, PostgreSQLis ja LibreOffice Baseis tekstilisi väärtuseid, kui üks väärtus puudub (on NULL)?

Postitas Erki Eessaar 23.03.2024 16:53 (muudeti 23.03.2024 17:29)
Oletame, et andmebaasis on tabel, kuhu on lisatud kaks rida andmeid. Ühel isikul perenimi puudub (on NULL).

CREATE TABLE Isik(isik_id INTEGER,
eesnimi VARCHAR(50) NOT NULL,
perenimi VARCHAR(50),
CONSTRAINT pk_isik PRIMARY KEY (isik_id));

INSERT INTO Isik (isik_id, eesnimi) VALUES (1,'Mati');
INSERT INTO Isik (isik_id, eesnimi, perenimi) VALUES (2,'Kati','Karu');

Ülesanne: Leia kõik isikud. Väljasta iga isiku kohta isik_id ning ees- ja perenimi ühe stringina. Nime komponentide vahel peab olema tühik.

PostgreSQL

SELECT isik_id, eesnimi || ' ' || perenimi AS nimi
FROM Isik;

Isikul, kelle perenimi on NULL, on nime väljas samuti NULL, sest NULL || 'tekst'=>NULL

Kuidas saada tulemus, kus puuduva perenimega isikul on nime väljas eesnimi?

Lahendus 1: Funktsioon Coalesce tagastab vasakult lugedes esimese argumendi, mis pole NULL. Selle abil asendatakse NULL tühja stringiga. Funktsiooni Trim abil eemaldatakse stringi lõpust tühik.
SELECT isik_id, Trim(eesnimi || ' ' || Coalesce(perenimi,'')) AS nimi
FROM Isik;

Lahendus 2:
SELECT isik_id, Trim(Concat(eesnimi,' ',perenimi)) AS nimi
FROM Isik;

Lahendus 3: Trim funktsiooni tühiku eemaldamiseks eesnime järelt ei ole vaja.
SELECT isik_id, Concat_ws(' ', eesnimi, perenimi) AS nimi
FROM Isik;

Lahendus 4:
SELECT isik_id, Trim(Format('%1$s %2$s', eesnimi, perenimi)) AS nimi
FROM Isik;

MS Access

SELECT isik_id, Trim(eesnimi & ' ' & perenimi) AS nimi
FROM Isik;

MS Accessis on kaks eraldi stringide konkatenatsiooni operaatorit, mille korral on erinevus tulemuses, kui argument on NULL.

NULL & 'tekst'=>'tekst'
NULL+tekst=>'tekst'

LibreOffice Base (kasutab HSQLDB)

SELECT ISIK_ID, Trim(BOTH FROM (EESNIMI || ' ' || Coalesce(PERENIMI,''))) AS NIMI
FROM ISIK;

Sarnaselt PostgreSQLile NULL || 'tekst'=>NULL. Seega kasutatakse Coalesce funktsiooni, et asendada NULL tühja stringiga.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!