Diskuze: SELECT z tabulky
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Je to takové trošku zmatené. Co má znamenat "email nebo NULL"?
Předpokládám, že je to "text", takže buď tam je vyplněn email, nebo nic.
Z toho jak jsi to napsal to skoro vypadá, že chceš vypsat úplně vše.
Trošku to upřesni. Chceš zobrazit emaily nebo nechceš?
Co vlastně chceš zobrazit a co s tím pak chceš dělat?
V cílové tabulce bude sloupec, který má název "TelefonORG" a budou tam
data buď Telefon, Mobil nebo NULL.
Takto by to bylo jednoduché, jenže já tam k tomu musím přidat i firmy,
které mají v kontaktech vyplněný email, ale ten email potom nechci
zobrazit.
Princip je asi takový, vytvářím nějaký report a v tom reportu je sloupec telefon organizace "TelefonORG" (kde bude jejich Telefon, Mobil a pokud nemají přiřazené ani jedno bude tam NULL, jenže firmy, které mají přiřazený i email tam budou zahrnuty taky, ale email nebude vypsán protože je nežádoucí do sloupce "TelefonORG" vypisovat email.
Ten sloupec TelefonORG obsahuje FK kt.ID_TypKontakt kde 'kt' je tabulka Kontakt a podle ID_TypKontakt (FK z tabulky TypKontakt) se určuje jaký typ kontaktu to je. (1 Telefon, 2 email, 3 mobil, atd.)
Máš na mysli něco takového?
SELECT * FROM Tabulka WHERE ((telefon <> "") OR (mobil <> "") OR (email <> ""))
V podstatě ano, akorát potom se mi ve sloupci TelefonORG objeví i email. Není nějaká funkce která by ten email v tom selectu třeba přepsala (třeba na NULL)? Zkoušel jsem REPLACE ale stejně mi nešlo jak v SQL říct, že z toho jednoho sloupce chci nahradit jen email a né ty telefonní čísla.
SELECT kt.ID, kt.TelefonORG
FROM Kontakt kt
WHERE (id_TypKontakt BETWEEN 1 AND 3) OR id_TypKontakt IS NULL
ID 1 a 3 jsou Telefon a mobil. ID 2 je email. Chci vypsat i záznamy co mají jen ten email ale samotný email už nechci zobrazit. Tím myslím, že kt.ID by se zobrazilo, ale v tom záznamu za kt.TelefonORG by bylo např. NULL.
V čem to vlastně děláš? Přece si z dotazu můžeš vybrat, co chceš zobrazit a co ne...
MS SQL, to ano, mohl bych si vybrat co chci zobrazit kdybych měl zdrojová data uspořádané ve sloupcích jakože zvlášť Telefon, Mobil, Email atd. jenže takhle to nemám. Mám k dispozici právě jen dva sloupce, 1. ID_TypKontakt, 2. Text. V 1. sloupci jsou IDčka 1, 2, 3 atd. kde 1 značí, že záznam je telefon, 2 že je email a 3 je mobil. Tedy všechny kontaktní data jsou naházeny jen v 2. sloupci pod sebou.
Jsem z toho zmatenej. Napiš mi strukturu všech tabulek, co se tam používají, ať se v tom trochu vyznám...
Však jsem se to snažil napsat už předtím. Tak dobře, pošlu ti přímo příklad těch tabulek. A řekňěme, že některá organizace nemá uvedený kontakt (NULL), to nevadí a vypíšeme u tel. čísla NULL. Ale některá organizace má uloženo jen ID_Kontakt=5 (Mají jen email, ale v nemají NULL!). V tom případě ji při výpisu chci vypsat, ale ten email nechci zobrazit.
Kontakt
ID ID_TypKontakt Text ID_Organizace
1 5 http://webiste.com Organizace 1
2 1 +421111222333 Organizace 1
3 1 +421000111222 Organizace 1
4 1 +421000111222 Organizace 3
5 2 [email protected] Organizace 4
7 7 6666666 Organizace 3
8 3 +420123456789 Organizace 2
9 2 [email protected] Organizace 2
TypKontakt
ID Text
1 Mobil
2 E-mail
3 Telefon
4 Fax
5 URL web
.
.
TelefonORG (Výsledný sloupec, který obsahuje jen Telefon, Mobil a když org. nemá přiřazeno tak NULL)
Měl by vypadat takto:
+420123456789
+420987654321
+421456789123
NULL
+420123456999
NULL
NULL
NULL
Jenže u mě vypadá takto:
+420123456789
+420987654321
+421456789123
[email protected]
+420123456999
NULL
[email protected]
NULL
Mohl bych z WHERE odstranit emaily, v tom případě by se mi nezobrazili, ale jak jsem psal dříve, některé organizace které mají v kontaktu uveden jen email by to vyhodilo.
Pořád to je takový zmatený, jediný co jsem pochopil je, že ta tabulka je blbě navržená a máš bordel v datech (neříkám že to je tvoje chyba, možná jsi jen přišel k hotovému a musíš s tím pracovat).
Každopádně pokud nechceš aby se ti zobrazoval email, jde vyjít z toho že validní!!! email obsahuje zavináč a validní telefon ne. Takže můžeš použít něco jako:
SELECT * FROM Tabulka WHERE Text NOT LIKE '%@%' -- + nějaký další podmínky podle potřeby
A ještě napiš v čem to děláš? C#, ASP.NET, nebo v čem to zobrazuješ?
Ano, přišel jsem k hotovému. To co jsi psal, použít nemůžu, protože mi to nějaké organizace úplně vyháže. Potřebuju, aby tam ten celý řádek zůstal, jen aby se v tom jednom sloupci buď ten email nevypsal nebo se třeba přepsal na NULL.
MS SQL / Microsoft SQL Server Management Studio 2014
Jo takhle. Pokud to máš na MS SQL tak můžeš použít tohle:
SELECT CASE WHEN Text LIKE '%@%' THEN NULL ELSE Text END
FROM Tabulka
Tohle by ti mělo fungovat i když to není moc pěkný a netuším co to udělá s výkonem na větším množství dat.
Zobrazeno 15 zpráv z 15.