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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1734
  • Karma: 72
    • 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 oxo

  • Guru
  • *****
  • Příspěvků: 672
  • Karma: 37
    • 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ů: 1734
  • Karma: 72
    • 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 oxo

  • Guru
  • *****
  • Příspěvků: 672
  • Karma: 37
    • 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 oxo

  • Guru
  • *****
  • Příspěvků: 672
  • Karma: 37
    • 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ů: 1734
  • Karma: 72
    • 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ů: 2720
  • Karma: 26
    • 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ů: 1734
  • Karma: 72
    • 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: