Diskuze: SQL SELECT kde hodnota môže ale nemusí byť null
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 23 zpráv z 23.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Založ si riadok, v ktorom budeš mať akože "root" a ten bude mať id=1. Potom všetky priečinky, ktoré budú v roote budú mať id rodiča 1 a tým to odlíšiš potom v PHP, že je to root. Aspoň ja mám s takýmto riešením iks skúsenosti.
No však to isté píšem ja... môže to byť 0, 1, alebo hocijaká iná konštanta... hlavne aby to nebolo null.
Asi by bolo dobre, keby is tu dal celé query, no tvoj problém sa zrejme bude dať vyriešiť aj tak, aby si napísal
SELECT ... FROM ... WHERE folder_id=$x AND folder_id IS NOT NULL
No keby som nastavil to folder_id na 0 tak ten root by som v databaze
nevytvaral vobec. AI ti nikdy nehodi idcko 0 zacina od 1 takze to neni az tak
celkom to iste 
Nenapada ma ako by sa ta funkcia dala tu pouzit. Ide o to ze chcem spravit
nasledovny select:
WHERE folder_id=$x
ale ak $x je null tak potom predchadzajuca query nefunguje a musim pouzit
tuto:
WHERE folder_id IS NULL
Otazka je ako to spraviť pomocou 1 query?
Viděl bych to asi nějako takto:
SELECT COALESCE(folder_id, <zastupna_hodnota_za_null>) FROM XXX WHERE folder_id=$x OR folder_id IS NULL
Jen mi není úplně jasné, na co vybíráš konkrétní folder_id, nebo všechny kde je folder_id null.
No priecinky mozu byt vnorene do seba cize kazdy ma stlpec id co je jeho unikatne id a stlpec folder_id co je vlastne nieco ako parent_id.
Tamta query vytiahne vsetky zaznami kde folder_id=$x + prida k tomu vsetky zaznami kde je folder_id null to nie je dobre.
Ide o to ze ked si otvorim priecinok s id napriklad 6 tak sa mi zobrazia vsetky priecinky kde parent_id=6. Ale ked otvorim v podstate root priecinok zobrazia sa vsetky priecinky kde parent_id IS NULL.
Preto potrebujem bud query ktora to zvladne. Alebo nejaky napad ako prerobit
navrh db 
Moja ideologia bola taka ze kym uzivatel sam nevytvori nejaky priecinok databazova tabulka by mala byt prazdna a preto root nie je ulozeny v db.
Chápu co máš, ale asi jsem úplně hloupej, protože doteď kloudně nechápu co z toho QRY chceš dostat.
chcem (a) a (b) v jednom v podstate
lebo predsa je to velmi podobna vec s minimalnym rozdielom a podla mna
na to staci 1 query.
Keby tie root zlozky mali parent_id 0 a nie null tak potom by to islo krasne jednou jedinou query. Preto teraz aktualne prerabam tymto spôsobom. Chapes, z postu mi moze prist nejake $x a ked tam mam query WHERE folder_id=$x a nahodov mi pride z postu null a nie nejake konkretne id tak uz musim pomocov ifu pouzit inu query, a to nechcem.
Kedze uz to riesim tak ze som null nahradil 0 tak je po probleme ale:
1.) chcem vediet ci sa da taka query zostavit
2.) chcem prediskutovat ine mozne riesenia
3.) kto bude posluchat dostane bod za spravne riesenie

Tamta query vytiahne vsetky zaznami kde folder_id=$x + prida k tomu vsetky zaznami kde je folder_id null to nie je dobre.
chcem (a) a (b) v jednom v podstate
lebo predsa je to velmi podobna vec s minimalnym rozdielom a podla mna na to staci 1 query.
To si trochu protiřečí, nemyslíš?
No ja ich nechcem vsetky naraz predsa!
Ta tvoja query by urobila to ze ak pride id 6 tak query vytiahne vsetky priecinky kde je folder_id=6 a este k tomu prida aj priecinky kde folder_id IS NULL. To je zle!
Ak mi pride z postu null tak chcem zobrazit priecinky kde folder_id je null. Ak mi pride z postu 6 napriklad tak chcem zobrazit iba priecinky kde folder_id je 6 a nie kde folder_id je 6 alebo null.
Ta tvoja query by v oboch pripadoch vytiahla vsetky priecinky korych folder_id je null. Plus v prvom pripade by k nim pridala este priecinky ktorych folder_id je 6.
Stale nechapačky?
Takže ty chceš pro parametr x = null vybrat všechny s folder_id = null, a pro x ∈ N vybrat všechny, kde je folder_id je x?
SELECT id FROM table WHERE (x IS NULL AND folder_id IS NULL) OR (x IS NOT NULL AND folder_id = x);
Máme víťaza
to je
presne ono ale je to kua kua dlha query no aj tak dobre vediet
Ďakujem krásne 
Teď už chápačky. Až dosud jsi ale nenapsal co od toho chceš. To že to víš ty neznamená, že to chápou ti, kterým dotaz pokládáš...
Obecně by tohle mělo řešit query přes parametry, vkládat hodnotu přímo do query je nebezpečné (SQL injection) a v tomhle případě ti neumožňuje dosáhnout toho co chceš.
Ale k věci:
SELECT ... FROM ... WHERE IIF($x == -999, folder_id is null, folder_id=$x);
Neaktivní uživatel
Ta druhá podmínka je zbytečná, když vybíráš folder_id dle hodnoty,
nevrátí ti ty kde je hodnota nul.l
Já jsem na to koukal už včera, ale nevěděl jsem, co chceš
Musíš si uvědomit, že null v
databázích je úplně jiný jako v programování. V programování je to
dejme tomu jako něco bez hodnoty, neinicializované. V databázích je to jako
neznámá hodnota. To znamená, že nemůžeš říct, jestli se null něčemu
rovná nebo ne, proto všechny porovnání nad null hodnotami vrací null.
1 = 1 -- 1
1 = null -- 0
1 <> null -- 0
null = null -- 0
null <> null -- 0
null is not null -- 0
null is null -- 1
Pokud se nepletu, tak IIF není standartní součást SQL, tudíž to není zas tak fajn řešení.
Máš pravdu, mohl jsem ho nahradit. Ale přišlo mi to nejčitelnější
(když nepočítám ten překlep s rovnítkama
). Byl to jen návrh řešení,
co si z toho tazatel vezme je na něm ...
Postupne sme sa ale k tomu dostali a pochopili co by som si vlastne od vas
prosil takze vsetko je v poriadku tiez som len clovek a nie som dokonali ale
snazil som sa to vysvetlit tak aby ste to pochopili 
Ano riesim to cez parametre ale sem som to napisal pre ulahcenie ako cistu
query 
Zobrazeno 23 zpráv z 23.
