Autor Téma: WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv  (Přečteno 2976 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Kód: [Vybrat]
WHERE
   ((CASYNTHETIC.TITLE <> '' /*OR CASYNTHETIC.TITLE IS NOT NULL*/) AND
 (CAGROUPS.TITLE <> '' OR CAGROUPS.TITLE IS NOT NULL)) AND
  CAGROUPS.FKCACLASSES = 1
Akonáhle vyhodím /* */, tak sa mi vo výsledku ukážu záznamy, kde je CASYNTHETIC.TITLE prázdny.
Pre istotu celý kód a výsledok
Kód: [Vybrat]

SELECT
  CAGROUPS.IDCAGROUPS,
  CAGROUPS.CODE || ' - ' || CAGROUPS.TITLE AS GROUPTITLE,
  CASYNTHETIC.IDCASYNTHETIC,
  CASYNTHETIC.CODE || ' - ' || CASYNTHETIC.TITLE AS SYNTHETICTITLE
FROM
  CACLASSES
  INNER JOIN CAGROUPS ON (CACLASSES.IDCACLASSES = CAGROUPS.FKCACLASSES)
  INNER JOIN CASYNTHETIC ON (CAGROUPS.IDCAGROUPS = CASYNTHETIC.FKCAGROUPS)
WHERE
   ((CASYNTHETIC.TITLE <> '' OR CASYNTHETIC.TITLE IS NOT NULL) AND
 (CAGROUPS.TITLE <> '' OR CAGROUPS.TITLE IS NOT NULL)) AND
  CAGROUPS.FKCACLASSES = 1
ORDER BY
  CAGROUPS.CODE, CASYNTHETIC.CODE
Dodatok: hodnotu null v tabuľkách vôbec nemám.
« Poslední změna: 20-07-2016, 11:41:57 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #1 kdy: 20-07-2016, 11:50:18 »
Aj toto mi dáva očakávaný výsledok
Kód: [Vybrat]
WHERE
 ((CAGROUPS.TITLE <> '' OR CAGROUPS.TITLE IS NOT NULL) AND
   (CASYNTHETIC.TITLE <> '' OR CASYNTHETIC.TITLE IS NULL)) AND // Vyhodený NOT
  CAGROUPS.FKCACLASSES = 1
Vôbec tomu nerozumiem :(
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #2 kdy: 20-07-2016, 12:21:18 »
Už mi to došlo. Prázdny reťazec nie je null. Takže podmienka
Kód: [Vybrat]
(CASYNTHETIC.TITLE <> '' OR CASYNTHETIC.TITLE IS NOT NULL)bude vždy vyhodnotená ako TRUE ak tam nemám hodnoty NULL.
« Poslední změna: 20-07-2016, 12:29:06 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline xhenryx

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #3 kdy: 20-07-2016, 14:46:25 »
na tohle využívám
Kód: [Vybrat]
nullif(CASYNTHETIC.TITLE,'') is not null

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #4 kdy: 20-07-2016, 18:53:08 »
Hm, to si len prázdny reťazec previedol na null. Ale ja sa snažím vyriešiť problém, keď mám v tabuľke v jednom stĺpci (string) hodnoty '' aj null. A ja všetky takéto tie riadky chcem
a) vynechať a zobraziť tie s textom
b) zobraziť a vynechať tie s textom

A to sa mi nedarí.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #5 kdy: 20-07-2016, 19:14:35 »
a) vynechať a zobraziť tie s textom
(CASYNTHETIC.TITLE IS NOT NULL AND CASYNTHETIC.TITLE <> '')
Citace
b) zobraziť a vynechať tie s textom
(CASYNTHETIC.TITLE IS NULL OR CASYNTHETIC.TITLE = '')

(rika se tomu De Morganovy zakony)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #6 kdy: 20-07-2016, 19:20:22 »
Citace
(rika se tomu De Morganovy zakony)
Tak o tých som ešte nepočul. To or v b) by som nedal.
Ďakujem.

Tak som sa pozrel na internet a je to teraz učivo pre základné školy :o  A ja ani len nepoznám základné výrazy čo sa tam používajú ;D
« Poslední změna: 20-07-2016, 19:28:21 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #7 kdy: 20-07-2016, 19:40:11 »
a) vynechať a zobraziť tie s textom
(CASYNTHETIC.TITLE IS NOT NULL AND CASYNTHETIC.TITLE <> '')

Já žil v domění, že všechny komparátory automaticky ignorují NULL. T.j. v tomto případě by mělo stačit:
Kód: [Vybrat]
CASYNTHETIC.TITLE <> ''
(Nebo to je závislé od DB? Alespoň PostgreSQL se mi tak chová.) Nemám zapotřebí do tebe rýpat, jen abych náhodou někdy nebyl zaskočen.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #8 kdy: 20-07-2016, 21:58:55 »
Tak som sa pozrel na internet a je to teraz učivo pre základné školy :o  A ja ani len nepoznám základné výrazy čo sa tam používajú ;D

To se mi moc nezdá, možná tak v matematické logice na střední. Ale stačí si pamatovat, že

negace(a or b) je neg(a) and neg(b)

analogicky pro and. Prostě se ta negace aplikuje na jednotlivé členy i nahradí and/or

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 568
  • Karma: 23
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #9 kdy: 20-07-2016, 22:03:08 »
(Nebo to je závislé od DB? Alespoň PostgreSQL se mi tak chová.) Nemám zapotřebí do tebe rýpat, jen abych náhodou někdy nebyl zaskočen.

operace s nully většinou končí nullem (tj výsledek je neznámá hodnota), chování může záviset na db i na nastavení db. Ale mělo by se rozlišovat třeba mezi = a "is null". Třeba "if a = null akce" se taky nemusí provést nikdy bez ohledu na hodnotu a, protože porovnání s null je taky neznámá hodnota, takže to nebude true nikdy. Ale je možné, že některé db to vyhodnotí stejně jako is null, takže pro null to tam vleze...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #10 kdy: 20-07-2016, 22:04:50 »
Máš pravdu. Je to stredná škola. Poplietol ma vzhľad stránky. Tých výrazov je tam viac.
http://www.oskole.sk/?id_cat=2&clanok=9691
To vysvetlenie je zaujímavé.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #11 kdy: 21-07-2016, 07:48:27 »
Já žil v domění, že všechny komparátory automaticky ignorují NULL. T.j. v tomto případě by mělo stačit:
Kód: [Vybrat]
CASYNTHETIC.TITLE <> ''Nebo to je závislé od DB?
Jestli je to u vsech DB nebo alespon u tech, se kterymi jsem delal, si netroufnu rict, protoze HOSIP a navic uz 3. rokem delam v LINQ, kde ve where klauzulich pisu String.IsNullOrEmpty(...)
Ale v tomto konkretnim pripade mas nejspis pravdu a nedefinovane hodnoty jsou vylouceny. U jinych operaci s NULL je chovani RDBMS i DB klienta zavisle na konkretnim typu a nastaveni (napr. tusim Oracle od nejake verze dela z empty stringu NULL apod.)

Nicmene, jak pise Mi.Chal, operace s NULL jsou nedefinovane (napr. NULL == NULL je false), takze pokud je pole v DB definovano jako nullable, povazuji za spravne prinejmensim z pohledu srozumitelnosti, aby se to odrazilo i ve where klauzuli, podobne, jako kdyz se pracuje s ukazaletem na objekt (p <> nil and p.x <> ''). Pokud je ta operace nadbytecna, tak ji stejne optimizer vypusti. Ale kazdy na prvni pohled vidi, ze se operuje s nullable polem, zatimco kdyby se pouzila zkracena forma TITLE<>'', tak vis kulovy a musis se podivat na deklaraci tabulky. A kazdy program se pise jednou a cte mnohokrat...


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #12 kdy: 21-07-2016, 07:52:19 »
Máš pravdu. Je to stredná škola. Poplietol ma vzhľad stránky. Tých výrazov je tam viac.
http://www.oskole.sk/?id_cat=2&clanok=9691
To vysvetlenie je zaujímavé.
Tak se podivej na boolovskou logiku: https://cs.wikipedia.org/wiki/Booleova_logika

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #13 kdy: 21-07-2016, 10:35:28 »
Máš pravdu. Je to stredná škola. Poplietol ma vzhľad stránky. Tých výrazov je tam viac.
http://www.oskole.sk/?id_cat=2&clanok=9691
To vysvetlenie je zaujímavé.

Já si pamatuju, že jsme to brali na nižším stupni gymnázia, t.j. v rámci základního devítiletého vzdělání. Ale třídu ti neřeknu. Po kvartě jsem měnil gympl, tak proto to vím ;)
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #14 kdy: 21-07-2016, 11:53:19 »
za spravne prinejmensim z pohledu srozumitelnosti, aby se to odrazilo i ve where klauzuli, podobne, jako kdyz se pracuje s ukazaletem na objekt (p <> nil and p.x <> '')

To s tím objektem není zrovna správná paralela ;)
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #15 kdy: 21-07-2016, 13:36:15 »
To s tím objektem není zrovna správná paralela ;)
Proc ne? Stejne jako nemas co sahat na objekt, aniz bys zjistil, jestli existuje, tak u nullable pole IMHO nemas co pracovat s obsahem, pokud jsi operace nedefinovane pro NULL nevyloucil. Ostatne ono to vnitrne u rady RDBMS probiha podobne, jako s tim pointerem: napr. MSSQL si drzi priznaky vsech NULL hodnot v recordu v bitsetu a teprve pak leze po nejakych datech.

Ze to nekde nekdo mozna zkontroloval za tebe je jina vec, ale IMHO cesta k tomu, jak napsat srozumitelny a bezpecny soft to neni.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #16 kdy: 21-07-2016, 14:43:41 »
To s tím objektem není zrovna správná paralela ;)
Proc ne? Stejne jako nemas co sahat na objekt, aniz bys zjistil, jestli existuje, tak u nullable pole IMHO nemas co pracovat s obsahem, pokud jsi operace nedefinovane pro NULL nevyloucil. Ostatne ono to vnitrne u rady RDBMS probiha podobne, jako s tim pointerem: napr. MSSQL si drzi priznaky vsech NULL hodnot v recordu v bitsetu a teprve pak leze po nejakych datech.

Ze to nekde nekdo mozna zkontroloval za tebe je jina vec, ale IMHO cesta k tomu, jak napsat srozumitelny a bezpecny soft to neni.

Protože je zásadní rozdíl mezi
Kód: [Vybrat]
[1] A.b <> nil and A.b <> ''a
Kód: [Vybrat]
[2] A <> nil and A.b <> ''
Porovnání SQL "IS NULL" je případ [1] a porovnání objektu je případ [2]. Jsou to hrušky s jabkama.
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #17 kdy: 21-07-2016, 14:54:53 »
Porovnání SQL "IS NULL" je případ [1] a porovnání objektu je případ [2]. Jsou to hrušky s jabkama.
To zalezi, jak se na to koukas. Kdyz si predstavis, ze p z meho prikladu je objekt typu string a x treba jeho metoda nebo jsem mohl napsat odkaz na element p[x ],  tak je to porad totez: predchazi kontrola, zda je operace definovana.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #18 kdy: 21-07-2016, 15:12:20 »
Porovnání SQL "IS NULL" je případ [1] a porovnání objektu je případ [2]. Jsou to hrušky s jabkama.
To zalezi, jak se na to koukas. Kdyz si predstavis, ze p z meho prikladu je objekt typu string a x treba jeho metoda nebo jsem mohl napsat odkaz na element p[x ],  tak je to porad totez: predchazi kontrola, zda je operace definovana.

Právě, že SQL (x <> '') je definovaná pro jakoukoliv hodnotu v x, včetně null. https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 710
  • Karma: 43
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #19 kdy: 21-07-2016, 16:03:07 »
pf: myslím, že už jsem tvůj pohled pochopil. (Tady by měl být smajlík "palec nahoru", ale není k dispozici ;) )
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #20 kdy: 21-07-2016, 16:19:23 »
Právě, že SQL (x <> '') je definovaná pro jakoukoliv hodnotu v x, včetně null.
No to prave neni: jakmile je jeden z operandu NULL, nemuze byt vysledek TRUE nebo FALSE. Ale WHERE klauzule zahrne do result setu jen radky, u kterych vyjde TRUE a to je ten efekt, ktery preskace radky s UNKNOWN predikatem, tedy v tomto pripade x <> ''...

Kdyz odhlednu, ze dotazy do DB pisu pres dva roky v LINQ nad normalnimi objekty v C#, tak muj pohled je ten, ze nez zkoumat, jaky ma dopad UNKNOWN hodnota na chovani RDMBS v ruznych pripadech (viz ten odkaz d Wikipedie, ktery jsi posilal), tak ho explicitne osetrim, aby me a kazdemy jinemu, az to bude cist, bylo jasne, ze predpokladam vyskyt NULL v datech.

Nic vic za tim nehledej.
« Poslední změna: 21-07-2016, 16:20:55 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3001
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #21 kdy: 22-07-2016, 11:29:28 »
Tak som si vyskúšal všetky kombinácie čo ma napadli a taký je výsledok. Samozrejme vo FB.
ID     Mobil
1   null
2   0905 111 333
3   ''

SELECT ID FROM T
Ďalej podmienka + výsledok ID

Žiadna - 1, 2, 3
MOBIL IS NULL - 1
MOBIL IS NOT NULL - 2, 3

MOBIL = '' - 3
NOT (MOBIL = '') - 2

MOBIL <> '' - 2 // Právě, že SQL (x <> '') je definovaná pro jakoukoliv hodnotu v x, včetně null. Pravdu má pf1957.
NOT (MOBIL <> '') - 3

MOBIL IS NOT NULL AND MOBIL <> '' - 2 // Súhlasím s pf1957, že mám poukázať aj na výskyt NULL. Nezabudol som na to.
Negácia predchádzajúceho podľa De Morganových zákonov
MOBIL IS NULL OR NOT (MOBIL <> '') / MOBIL IS NULL OR (MOBIL = '') - 1, 3 // Jediný správny výsledok pre nezadané číslo
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

mickm

  • Host
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #22 kdy: 22-07-2016, 12:44:24 »
Pozri aj sem.

http://www.firebirdsql.org/refdocs/langrefupd20-distinct.html

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1869
  • Karma: 92
    • Verze Delphi: D2007, XE3, DX10
Re:WHERE TITLE IS NOT NULL - nefunguje podľa mojich predstáv
« Odpověď #23 kdy: 22-07-2016, 14:45:36 »
Pozri aj sem.
http://www.firebirdsql.org/refdocs/langrefupd20-distinct.html
To je dobra poznamka, uplne jsem zapomel, ze neco takoveho existuje   :'(

Ale na druhou stranu ne vsechny RDBMS to podporuji, napr. M$ zrovna ne a roky na ten pozadavek prdi: https://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: