Ustawienie typu danych kolumny podczas tworzenia widoku

0

Cześć
Jak można podczas tworzenia widoku ustawić typ danych kolumny w nim zawartej na inny niż domyślny?
Wytłumaczę o co chodzi:

CREATE VIEW view
AS SELECT
CASE
tutaj jakieś operacje na kolumnie z database
END
AS nazwakolumny
FROM DATABASE

I chcę, aby nazwakolumny była innym typem niż domyślnie ustawia ta operacja. Próbowałem jakieś operacje zrobić typu CAST() czy CONVERT, ale był błąd składniowy, a jak chcę zrobić UPDATE to oczywiście nie ma takiej możliwości.

Jak to dobrze zrobić, aby działało?

Będę wdzięczny bardzo za pomoc

2
kilroy napisał(a):

, ale był błąd składniowy,

genialnie podałeś problem.
Gratulacje.

3

Pokaż jakie masz dane, jak robiłeś tego casta i co to za baza. I pokaż ten bląd, bo bez tego to zgadywana jak ze szklanej kuli.

3
S4t napisał(a):

Pokaż, jakie masz dane, jak robiłeś tego casta i co to za baza. I pokaż ten bląd, bo bez tego to zgadywana jak ze szklanej kuli.

+1

A co da, że napiszę 10 możliwości jakich próbowałem skoro były źle napisane i nie wiem jak to poprawnie napisać? Mam zaśmiecać w ten sposób wątek? To nielogiczne. Chyba lepiej, jakby ktoś podał jak to ma prawidłowo wyglądać. — kilroy 33 minuty temu

Masz komunikat o błędzie. Tobie to może nic nie mówi, ale to jest generalnie informacja skrajnie użyteczna co poprawić.

Tzw biurwy w l 1990-2000 wyłączały zasilanie w komputerze "bo komputer coś napisał".
Wtedy wyłącznik to była wajcha z prawej strony.
Chcesz tak samo ?

3
kilroy napisał(a):

I chcę, aby nazwakolumny była innym typem niż domyślnie ustawia ta operacja. Próbowałem jakieś operacje zrobić typu CAST() czy CONVERT, ale był błąd składniowy, a jak chcę zrobić UPDATE to oczywiście nie ma takiej możliwości.

Nie czytałem wszystkich odpowiedzi, ale myślę że problem jest tutaj właśnie. Nie robi się UPDATE'ów do widoków. Ja wiem że w najprostszym przypadku niektóre brzydkie bazy na to pozwalają, ale ogólnie to zawsze się w końcu wywali jak widok się skomplikuje. Updaty robi się do tabel, a widoki są tylko do odczytu

0
S4t napisał(a):

Pokaż jakie masz dane, jak robiłeś tego casta i co to za baza. I pokaż ten bląd, bo bez tego to zgadywana jak ze szklanej kuli.

@S4t, @ZrobieDobrze : Faktycznie trochę za mało podałem danych za co przepraszam.
Tytułem wstępu to ja o bazach mało wiem, tyle co potrafię stworzyć proste tabele i relacje, a nauka o bazach danych wychodzi przy okazji nauki Javy.
widok tworzę w liquibase. Baza jest H2.

ZrobieDobrze napisał(a):

Masz komunikat o błędzie. Tobie to może nic nie mówi, ale to jest generalnie informacja skrajnie użyteczna co poprawić.

Tzw biurwy w l 1990-2000 wyłączały zasilanie w komputerze "bo komputer coś napisał".
Wtedy wyłącznik to była wajcha z prawej strony.
Chcesz tak samo ?

Jak najbardziej rozumiem tylko, w tym przypadku nie ma żadnej użytecznej informacji od liquibase.

<createView viewName="view">
SELECT
CASE
WHEN tutaj instrukcja THEN 
DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach)
END
AS nazwakolumny
FROM DATABASE

I w tym przypadku domyślnie typ danych w kolumnie to BIGINT. Chciałbym wiedzieć jak się castuje na VARCHAR czy INT. A robiłem przeróżne opcje:
1.

<createView viewName="view">
SELECT
CASE
WHEN tutaj instrukcja THEN 
CAST(DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach) AS INT)
END
AS nazwakolumny
FROM DATABASE
<createView viewName="view">
SELECT
CAST((CASE
WHEN tutaj instrukcja THEN 
DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach)
END) AS INT)
AS nazwakolumny
FROM DATABASE
<createView viewName="view">
SELECT
FIRST_DATA,
CASE
WHEN tutaj instrukcja THEN 
DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach)
END AS INT
AS CAST(nazwakolumny AS INT)
FROM DATABASE

I do wszystkich opcji też dodawałem przed SELECT i też zamiennie CAST używałem z CONVERT. W przypadku 1. w ogóle nie zamienia, a program startuje. W przypadkach 2 i 3 albo wysypuje błąd, że jest ";'', a spodziewane jest co innego, albo, że FIRST_DATA nie istnieje w DATABASE. Więc są to błędy, które chyba mało komu cokolwiek mówią, tak jak w Javie one występują, dlatego ich nie podawałem.

KamilAdam napisał(a):
kilroy napisał(a):

I chcę, aby nazwakolumny była innym typem niż domyślnie ustawia ta operacja. Próbowałem jakieś operacje zrobić typu CAST() czy CONVERT, ale był błąd składniowy, a jak chcę zrobić UPDATE to oczywiście nie ma takiej możliwości.

Nie czytałem wszystkich odpowiedzi, ale myślę że problem jest tutaj właśnie. Nie robi się UPDATE'ów do widoków. Ja wiem że w najprostszym przypadku niektóre brzydkie bazy na to pozwalają, ale ogólnie to zawsze się w końcu wywali jak widok się skomplikuje. Updaty robi się do tabel, a widoki są tylko do odczytu

Tak jak napisałem w komentarzu - dzięki wielkie, ale chodziło mi właśnie, że wiem, że niemożliwe są operacje na widoku typu UPDATE, bo to widok niezmaterializowany, a nie faktycznie tabela. Ale jestem wdzięczny za odpowiedź.

2
kilroy napisał(a):
<createView viewName="view">
SELECT
FIRST_DATA,
CASE
WHEN tutaj instrukcja THEN 
DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach)
END AS INT
AS CAST(nazwakolumny AS INT)
FROM DATABASE

I do wszystkich opcji też dodawałem przed SELECT i też zamiennie CAST używałem z CONVERT. W przypadku 1. w ogóle nie zamienia, a program startuje. W przypadkach 2 i 3 albo wysypuje błąd, że jest ";'', a spodziewane jest co innego, albo, że FIRST_DATA nie istnieje w DATABASE. Więc są to błędy, które chyba mało komu cokolwiek mówią, tak jak w Javie one występują, dlatego ich nie podawałem.

Cały problem polega na tym, że nadal piszesz do nas na zasadzie "Zrobiłem COŚ i wyskoczył błąd", ale nie chcesz napisać, czym jest COŚ.
Zobacz sobie, czy w tabeli DATABASE istnieje kolumna FIRST_DATA, bo jeden z błędów sugeruje, że jej tam nie ma.

Na tym forum jest sporo bazodanowych mózgów. Gwarantuję Ci, że jeśli wkleisz swój kod, komunikat błędu, jaki dostajesz i podasz info, na jakimś silniku bazodanowym pracujesz, nie minie dużo czasu, nim rozwiązanie dostaniesz niemal na tacy.
Niestety, jeśli do kodu wstawiasz "tutaj po prostu wyliczanie różnicy datowej w latach", a komunikat cytujesz na zasadzie "spodziewane jest co innego", to trudno będzie Ci pomóc, bo podejrzewam, że właśnie w Twoich "tutaj instrukcja" i "tutaj po prostu wyliczanie różnicy datowej w latach" może kryć się błąd.

Swoją drogą z tych trzech Selectów temu drugiemu najbliżej jest do poprawnej składni, ale... zastanawiam się po kiego grzyba chcesz CASTować DATEDIFFA do INTa, skoro DATEDIFF domyślnie zwraca właśnie INT?

0
Fac napisał(a):
kilroy napisał(a):
<createView viewName="view">
SELECT
FIRST_DATA,
CASE
WHEN tutaj instrukcja THEN 
DATEDIFF(tutaj po prostu wyliczanie różnicy datowej w latach)
END AS INT
AS CAST(nazwakolumny AS INT)
FROM DATABASE

I do wszystkich opcji też dodawałem przed SELECT i też zamiennie CAST używałem z CONVERT. W przypadku 1. w ogóle nie zamienia, a program startuje. W przypadkach 2 i 3 albo wysypuje błąd, że jest ";'', a spodziewane jest co innego, albo, że FIRST_DATA nie istnieje w DATABASE. Więc są to błędy, które chyba mało komu cokolwiek mówią, tak jak w Javie one występują, dlatego ich nie podawałem.

Cały problem polega na tym, że nadal piszesz do nas na zasadzie "Zrobiłem COŚ i wyskoczył błąd", ale nie chcesz napisać, czym jest COŚ.
Zobacz sobie, czy w tabeli DATABASE istnieje kolumna FIRST_DATA, bo jeden z błędów sugeruje, że jej tam nie ma.

Na tym forum jest sporo bazodanowych mózgów. Gwarantuję Ci, że jeśli wkleisz swój kod, komunikat błędu, jaki dostajesz i podasz info, na jakimś silniku bazodanowym pracujesz, nie minie dużo czasu, nim rozwiązanie dostaniesz niemal na tacy.
Niestety, jeśli do kodu wstawiasz "tutaj po prostu wyliczanie różnicy datowej w latach", a komunikat cytujesz na zasadzie "spodziewane jest co innego", to trudno będzie Ci pomóc, bo podejrzewam, że właśnie w Twoich "tutaj instrukcja" i "tutaj po prostu wyliczanie różnicy datowej w latach" może kryć się błąd.

Swoją drogą z tych trzech Selectów temu drugiemu najbliżej jest do poprawnej składni, ale... zastanawiam się po kiego grzyba chcesz CASTować DATEDIFFA do INTa, skoro DATEDIFF domyślnie zwraca właśnie INT?

@Fac:

  1. Kolumna istnieje i w tym przypadku była to wina ewidentnie składniowa, źle napisałem kod.

  2. Po prostu myślałem, że takie szczegóły, które są dobrze napisane (bo działają bez castowania) nie są potrzebne. Ale dzięki, następnym razem będę pamiętał.

  3. No właśnie nie zwraca mi INT tylko BIGINT . Tak samo poniżej mam funkcję COUNT, która też, nie wiedząc czemu, zwraca mi BIGINT, a nie INT. Sam nie wiem czemu tak robi, bo nigdzie nic nie zamieniam.

Tak czy siak dziękuję wszystkim za chęć pomocy, rozwiązałem to jednak sam i moje głupie niedopatrzenie, bo w przypadku 1 działało to rozwiązanie, a ja nie doczytywałem już zirytowany, że to już tyczy się kolejnego przypadku właśnie, gdzie używam COUNT. Pewnie nie jest to najlepiej składniowo, ale zaraz poprawię na taki sposób co napisał @Fac, żeby było poprawnie.

A na prawdę jestem bardzo wdzięczny za odpowiedzi i chęci pomocy. Przepraszam za zamieszanie i jeśli ktoś zrozumiał moje wypowiedzi pt. "dej", to przepraszam bo absolutnie tak nie jest, bardzo doceniam Waszą pomoc - nie chciałem po prostu tracić Waszego czasu na czytanie kodu, którego problem nie dotyczy, ale jak widać chyba będzie lepiej wklejać wszystko, bo tam jednak może być błąd i w caloksztalcie lepiej wiadomo o co chodzi.

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