[SQL] Simpele convert-actie.... :?

Pagina: 1
Acties:

  • Toink
  • Registratie: Januari 2000
  • Niet online
Hoi,

Tegen het volgende probleem loop ik aaan:

Ik heb een DB met een tabel. Een kolom in die tabel bevat de status (id van 1 t/m 6). Nou wil ik een rapport in elkaar draaien en dat netjes uitprinten. Dat lukt prima maar ipv de statusid wil ik de naam van de status zien.

Er is geen tabel met statusID (Pr. Key) en statusnaam die je eenvoudig kan linken; Die mag ook niet gemaakt worden, dus die mogelijkheden vallen meteen weg.

Ik zat er aan te denken om een view te maken van de huidige tabel en deze aan te passen als deze gemaakt wordt. Alleen (en nu komt de vraag :+ ) hoe doe ik dat? Ik weet hoe je een view maakt maar het stukje code om die conversie uit te voeren heb ik niet. Kan iemand mij op weg helpen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Hoe wil jij de naam van de status afprinten als die naam van die status nergens bewaard word? Hard-coded? Niet erg onderhoudsvriendelijk als je 't mij vraagt...

Of anders nog: als je die statusnaam nergens bewaart, waarom ga je dan ipv een statusId te gaan gebruiken in die bepaalde tabel, de statusnaam niet gaan opslaan?

https://fgheysels.github.io/


  • Toink
  • Registratie: Januari 2000
  • Niet online
Whoami, je hebt helemaal gelijk! Dat moet dus via die convert-actie. De naam staat inderdaad nergens in de db opgeslagen (hey, ik heb 't niet bedacht, I was called to fix it :))

Statusnamen opslaan mag ook niet. Ik mag simpelweg de db niet veranderen, alleen views aanmaken enzo. En dan moet ik de zaak dus goed converteren zodat dingen begrijpbaar zijn voor de eindgebruikers.

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
Bedoel je zo iets?
code:
1
2
SELECT IIF(id=1,"aap",IIF(id=2,"noot","mies")) AS Status
FROM tabelletje

Type het wel uit mijn hoofd in, dus er kunnen (punctuerings)foutjes in zitten.

Oh ja, ik merk zelf dat veel mensen de IIF niet kennen (ja met 2x i), o.a. mijn collega's.

  • Toink
  • Registratie: Januari 2000
  • Niet online
IIF ja, dat zou volgens mij wel kunnen werken. Ik ken 'm wel al maar ik had 'm al HEEL lang niet meer gezien. Dat ga ik eens proberen......

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Is IIF() geen MS - only functie?

https://fgheysels.github.io/


  • Toink
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 19 augustus 2002 @ 16:23:
Is IIF() geen MS - only functie?
MS SQL-server here :*)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
IIF is volgens mij alleen te gebruiken binnen Access. Als je een andere DBMS gebruikt, zul je dus op zoek moeten naar iets anders.

Never underestimate the power of


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Oeps even een paar replies gemist.
Maar als je MSSQL hebt, is het vrij eenvoudig.
Voorbeeldje:

Status = CASE (Status) WHEN 1 THEN 'Status 1' WHEN 2 THEN 'Status 2' END

Never underestimate the power of


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Je kan natuurlijk ook gebruik maken van T-SQL op SQL Server, dan zou je dus een mooie procedure kunnen schrijven :)

  • Toink
  • Registratie: Januari 2000
  • Niet online
code:
1
2
3
4
CREATE VIEW testview AS 
SELECT     IIF(ID = 1, 'test1', IIF(ID = 2, 'test2', IIF(ID = 3, 'test3', IIF(ID = 4, 'test4', IIF(ID = 5, 'test5', IIF(ID = 6, 'test6')))))) 
AS Status
FROM tbdocument


Dit is wat ik nu heb, maar dan krijg ik deze foutmelding:

Error in list of function arguments: '=' not recognized.
Unable to parse query text.

Wat doe ik fout?

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
In MS-Access werkt je query wel. Ik weet zeker dat het in SQL-Server (7) ook MOET werken, heb het namelijk afgelopen schooljaar gebruikt tijdens een project.
Kijk eens in Books-Online. Staat het vast wel in. Heb helaas geen SQL-Server bij de hand om uit te proberen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Ga eens in de Msdn kijken hoe je die IIF moet gebruiken. Wat je fout doet: misschien een haakje, komma, .... vergeten. Misschien moet je niet = doen maar == etc...

Met andere woorden: doe zelf ook eens moeite om het uit te zoeken.

https://fgheysels.github.io/


  • Toink
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 19 augustus 2002 @ 16:46:
Ga eens in de Msdn kijken hoe je die IIF moet gebruiken. Wat je fout doet: misschien een haakje, komma, .... vergeten. Misschien moet je niet = doen maar == etc...

Met andere woorden: doe zelf ook eens moeite om het uit te zoeken.
Wat die haakjes, komma's quotes etc betreft: Daar ben ik ook mee bezig. Als ik zoek op IIF wordt mij uitgelegd hoe dat werkt maar dat is net wat ik al weet. Wat ik niet weet is hoe ik dat in een SQL-statement voor een view hang.

/zojuist gevonden: IIF werkt niet onder sql server. Daarvoor moet je inderdaad het case-commando hebben.

Verwijderd

Ik weet niet welke SQL versie je gebruikt, maar MSSQL7.0 kent de IIF niet als SQL statement. (In SQL2000 kan deze wel in een functie aangeroepen worden)

Waarom maak je geen gebruik van het CASE statement?

[te laat]

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 13-08 20:56

jAnO!

lalalavanillevla

ff twee lelijke oplossingen:

1) pas het gewoon pas in het rapport aan...

2) select col1, col2, col3, "je status tekst1" from tabel where status =1;
select col1, col2, col3, "je status tekst2" from tabel where status =2;
etc..

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 13-08 20:56

jAnO!

lalalavanillevla

mooier:

Simple CASE Example
For each customer in the sample oe.customers table, the following statement lists the credit limit as "Low" if it equals $100, "High" if it equals $5000, and "Medium" if it equals anything else.

SELECT cust_last_name,
CASE credit_limit WHEN 100 THEN 'Low'
WHEN 5000 THEN 'High'
ELSE 'Medium' END
FROM customers;

CUST_LAST_NAME CASECR
-------------------- ------
...
Bogart Medium
Nolte Medium
Loren Medium
Gueney Medium

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
OK. nog maar een keertje dan.
IIF is een Access functie en wordt binnen SQL Server gebruikt voor MDX.
SQL Server heeft een hele handige variant en dan gaat de view er als volgt uitzien:

CREATE VIEW dbo.testview AS
SELECT
CASE (ID)
WHEN 1 THEN 'test1'
WHEN 2 THEN 'test2'
WHEN 3 THEN 'test3'
WHEN 4 THEN 'test4'
WHEN 5 THEN 'test5'
WHEN 6 THEN 'test6'
END AS Status
FROM tbdocument

PS: Ik heb hem niet gechecked op syntax fouten.

Never underestimate the power of


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 13-08 20:56

jAnO!

lalalavanillevla

en waarom wil je eerst een view maken?
je mag de database toch niet alteren?

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • Toink
  • Registratie: Januari 2000
  • Niet online
jAnO!, met een view verander je de database toch niet? Ik mag geen tabellen veranderen of toevoegen maar views aanmaken mag wel.

Cameodski: Bedankt! Jouw oplossing werkt.

[ Voor 0% gewijzigd door Toink op 20-08-2002 08:40 . Reden: /opgelost! ]


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 13-08 20:56

jAnO!

lalalavanillevla

Een view is wel degelijk een object in de database. Ik dacht op te maken uit je bewoordingen dat je geen objecten mag aanmaken in de database. Dat is dus blijkbaar wel zo..

Maar wat ik eigenlijk ook bedoel is dat ik het nut van deze view niet echt zie.. je wilt toch alleen een rapport?

(ps. als die oplossing van cameodski het doet doet ie van mij het ook ;))

bron van mijn oplosssing: (en tevens errug handige link)
http://download-west.orac...server.901/a90125/toc.htm

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • Toink
  • Registratie: Januari 2000
  • Niet online
De jouwe doet 't inderdaad ook maar gisteren crashte om 1 of andere reden mij Enterprise Manager voortdurend op jouw query (waarom weet ik nog steeds niet want naar mijn mening staat er nu precies hetzelfde :?)

Ik mag geen tabellen aanpassen/wijzigen/maken/verwijderen. De tabelstructuur moet dus ongewijzigd zijn. De rest mag wel.

Het nut van deze view zie je niet in deze context want die zit veel dieper dan ik hier opzet. Alleen als ik dat precies uit ga leggen haakt iedereen al af omdat het een lang verhaal is (waardoor de kans groot is dat een modje 't onsamenhangend vindt en dat ik het topic vervuil met irrelevante rommel zodat ie dicht gaat). Laat ik het erop houden dat dit heel breed toegepast gaat worden.

Ik ben trouwens ook al een tijd aan het zoeken naar een alternatief voor de functie MID() die een stukje van een string uitleest, maar dan voor SQL-server. Is er iemand die dat toevallig weet?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Daar kun je de volgende functie voor gebruiken:

SUBSTRING ( expression , start , length )

Zie eventueel ook Books Online.

Never underestimate the power of


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 13-08 20:56

jAnO!

lalalavanillevla

Ik heb trouwens nog ff zitten zoeken, maar volgens mij is zelfs de mooiste oplossing de decode functie:

This example decodes the value warehouse_id. If warehouse_id is 1, the function returns 'Southlake'; if warehouse_id is 2, it returns 'San Francisco'; etc. If warehouse_id is not 1, 2, 3, or 4, the function returns 'Non-domestic'.

SELECT product_id,
DECODE (warehouse_id, 1, 'Southlake',
2, 'San Francisco',
3, 'New Jersey',
4, 'Seattle',
'Non-domestic')
quantity_on_hand FROM inventories;

En misschien moet je ff kijken naar SUBSTR mbt. tot je MID() vraag.. hoewel ik inet weet of die het doet in sql-server...

http://download-west.orac...25/functions116.htm#87068

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Toink schreef op 20 augustus 2002 @ 10:50:
Het nut van deze view zie je niet in deze context want die zit veel dieper dan ik hier opzet. Alleen als ik dat precies uit ga leggen haakt iedereen al af omdat het een lang verhaal is (waardoor de kans groot is dat een modje 't onsamenhangend vindt en dat ik het topic vervuil met irrelevante rommel zodat ie dicht gaat). Laat ik het erop houden dat dit heel breed toegepast gaat worden.
Een klein beetje uitleg is denk ik geen probleem hoor. t Is den ik iig best intressant om te lezen waarom deze oplossing in jouw situatie zo goed is :)
Ik ben trouwens ook al een tijd aan het zoeken naar een alternatief voor de functie MID() die een stukje van een string uitleest, maar dan voor SQL-server. Is er iemand die dat toevallig weet?
Dan heb je zeker een tijdje lang je books online niet open gehad? :) Kijk eens naar de substring function.

Exact expert nodig?


  • Toink
  • Registratie: Januari 2000
  • Niet online
Die substring is inderdaad wat ik zocht en ik zal zo wat uitleg geven over de situatie. Dan eerst nog de vraag waarmee ik waarschijnlijk de grond in mag zakken: :? Books online :? (Heb wel even de search gebruikt maar kon zo snel niets vinden..... )

Een situatieschets: Er is een bestaande applicatie met een DB. Die is af. In die app zitten een paar rapporten en die werken prima. Nou wil de klant zelf rapporten maken maar de db is dermate complex en lastig (en ook op zo'n manier in de app gehangen dat je er niet aan wil/mag kloten; (opgelegde regels)) dat dit niet mogelijk is. Bovendien mag een klant niet de hele db zien. Vandaar dat er views moeten komen die het wat eenvoudiger maken en alleen de gevraagde informatie weergeven zodat je er heel dummy-esque mee kan rapporteren.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Toink schreef op 20 augustus 2002 @ 12:21:
Die substring is inderdaad wat ik zocht en ik zal zo wat uitleg geven over de situatie. Dan eerst nog de vraag waarmee ik waarschijnlijk de grond in mag zakken: :? Books online :? (Heb wel even de search gebruikt maar kon zo snel niets vinden..... )
Das de fucking manual :D mjah waarom ie books online heet weet ik niet want bij mij is het gewoon een compiled html file en dat is zo offline als de pest maar goed... ;)
shift+F1 vanuit de query analzyer en je komt er ook, maar als een beetje installatie hebt staat ie ook wel ergens in je start menu :)
Bovendien mag een klant niet de hele db zien. Vandaar dat er views moeten komen die het wat eenvoudiger maken en alleen de gevraagde informatie weergeven zodat je er heel dummy-esque mee kan rapporteren.
Dat klinkt idd als een verdraaid goede reden om views te gebruiken :)

Exact expert nodig?


  • Toink
  • Registratie: Januari 2000
  • Niet online
The documentation for SQL Server Enterprise Manager is included in SQL Server Books Online. If you installed SQL Server Books Online during Setup, it will open now.

........... we wachten in spanning af en er gebeurt...niets. Dat verklaart.

  • Toink
  • Registratie: Januari 2000
  • Niet online
Maargoed. Alles lijkt nu te werken en ik kan me nu gaan toeleggen op andere leuke problemen, zoals de 1000-hit-by-search niet-interessante conversie van YYYYMMDDHHMMSS naar een datum. Maar als ik daar niet uitkom dan open ik wel een nieuw topic :). Deze mag iig dicht.
Pagina: 1