skladnia(?) sql

0

czy istnieje mozliwosc zadania zapytania sql ktore zrobi cos takiego

[1]     select * from archiwum where NAZWA_KOLUMNY <  10;

gdzie NAZWA_KOLUMNY jest wynikiem zapytania

[2]     select Kolumna from tabela where id_tabela = 123;

(zakladam ze wynikiem tego ostatniego zapytania bedzie pojedyncza wartosc [np 'wiek'])

Chodzi o to zeby zapytanie [1] wyszukalo wszystkie rekordy ktore w polu NAZWA_KOLUMNY ma wartosc mniejesza niz 10.

Uzywam bazy mySQL5.0.2

0

select * from archiwum where (select Kolumna from tabela where id_tabela = 123) < 10;

w postgresie powinno działać, nie wiem jak w mysql.

0
wowo napisał(a)

select * from archiwum where (select Kolumna from tabela where id_tabela = 123) < 10;

Niestety taka skladnia zwroci pusty wynik

(zakladam ze zapytanie select Kolumna from tabela where id_tabela = 123; zwroci wynik 'wiek')

poniewaz dla kazdego rekordu z archiwum zostanie wykonany test 'wiek' < 10
// ciag znakow 'wiek' zostanie przyrownany do wartosci 10 (sprawdzalem juz wczesniej)
a mi chodzi o to zeby wartosc z kolumny o nazwie 'wiek' zostala przyrownana do wartosci 10.

da sie takie cos zrobic?

0

Najprościej będzie chyba wykonać po prostu dwa zapytania. Najpierw o nazwę kolumny, a potem zbudować drugie zapytanie, w którym jawnie użyjesz wcześniej pobranej nazwy kolumny.

0

no niby tak,
ale wydaje mi sie to jakos malo 'profesjonalne':-)
no i wymaga uzycia mojego programu do uzyskania odpowiedzi
a chcialbym zeby bylo to w miare 'uniwersalne' czyli
zadaje pytanie -> dostaje odpowiedz (bez dodatkowego kmbinowania)

Moze jakies procedury na serwerze?
tylko ze zupelnie sie na tym nie znam wiec prosilbym
o szczegolowy opis (kod :>) jak to wykonac...

0

jest takie zapytanie jak SHOW COLUMNS, wypisująca wszystkie kolumny w tabeli, wtedy może się da jakoś zakombinować ;). W MySQL niestety nie można tego użyć w podzapytaniu (w Oraclu można).

// edit

możesz spróbować jeszcze coś takiego, ale nie wiem czy poprawnie sformułowałem (nigdy nie używałem "CASE WHEN") i na pewno jest mało optymalne:

... WHERE CASE
WHEN 'kolumna1' IN (SELECT (...)) THEN kolumna1 < 10
WHEN 'kolumna2' IN (SELECT (...)) THEN kolumna2 < 10
END

0

Moze warto przemyslec strukture bazy? Warunkowanie czegokolwiek od nazwy kolumny (jezeli Cie dobrze rozumie), to nie najlepszy pomysl. W pewnym momencie znajdziesz sie w takiej pulapce, ze bedziesz musial przepisac aplikacje od zera.

0

Johny_Morfina, nie rób tego w ten sposób - może napisz tutaj jak wygląda po krótce ta baza, bo przy takich operacjach na pewno jest ona źle zaprojektowana.

0

Uzadzenie pomiarowe podpiete do komputera ma nieznana w czasie programowania
(konfigurowana przy instalacji programu) liste parametrow.

Lista miezonych parametrow wraz z kilkoma dodatkowymi informacjami
o kazdym jest trzymana w bazie (tabela PARAMETRY)

Komputer odczytuje dane, i co n-ty odczyt jest zapisywany do bazy. (tabela ARCHIWUM)
[W tej tabeli jest tyle kolumn ile miezonych parametrow + data i godzina odczytu]

Czasem uzadzenie generuje alarm (np duzy skok jakiejs wartosci).
takie alarmy sa zapisywane do bazy danych (tabela ALARMY)

Problem jest w tym jak w tabeli ALARMY zaznaczyc ktora wartosc wygenerowala zdarzenie...

aktualnie jest tak:
W tabeli ALARMY jest odwolanie (klucz obcy[?]) do tabeli ARCHIWUM

  • dzieki temu wiem jaki byl stan calego uzadzenie w momencie alarmu
    oraz odwolanie do tabeli PARAMETRY
  • biore z tamtad wlasnie ta nazwe kolumny, oraz pare innych wartosci potrzebnych do wyswietlenia

nic lepszego nie wymyslilem, ale widze ze to rozwiazanie jest kiepskie
jakby ktos mial pomysl jak sobie z tym poradzic to chetnie poczytam....

0 użytkowników online, w tym zalogowanych: 0, gości: 0