Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Mysql] Select wildcard voor veldnamen

Pagina: 1
Acties:

  • MichielioZ
  • Registratie: Augustus 2001
  • Laatst online: 11-11 20:46
Ik wil graag een query uitvoeren waarbij ik velden wil selecteren die met een bepaalde string beginnen (de veldnaam zelf dus).
Nu heb ik al behoorlijk wat afgezocht, maar nog niets gevonden hierover...
(Het zou natuurlijk kunnen dat 't uberhaupt niet mogelijk is)
Stel ik heb een tabel met users en ik begin alle velden met persoonlijke informatie van een user met "persoonlijk_", dan zou ik dus zoiets dit willen doen :
SQL:
1
SELECT persoonlijk_* FROM users

Dit werkt niet, omdat "*" alleen los gebruikt mag worden, maar is hier misschien een andere oplossing voor ?!

Iedereen wil terug naar de natuur, maar niemand wil lopend...


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 10:04
Nee dat kan niet op mysql-niveau.. Als je dit soort wensen hebt, dan is het meestal tijd om eens kritisch naar je datamodel te kijken. Als er functioneel verschil zit tussen persoonlijke gegevens en andere gegevens kan het handig zijn om die velden in een aparte tabel te zetten.

Wat wel kan is de structuur van de database bevragen via de database "information_schema" die mysql voor je bijhoudt. Bekijk die database maar eens. Iets als:
SQL:
1
SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_NAME = 'je tabel' and COLUMN LIKE 'persoonlijk_%'

Verwijderd

rutgerw schreef op maandag 17 december 2007 @ 11:55:
Wat wel kan is de structuur van de database bevragen via de database "information_schema" die mysql voor je bijhoudt. Bekijk die database maar eens. Iets als:
SQL:
1
SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_NAME = 'je tabel' and COLUMN LIKE 'persoonlijk_%'
Als dat kan, dan kan je toch ook een subquery maken?
SQL:
1
2
3
4
5
6
7
SELECT (
    SELECT COLUMN_NAME
    FROM COLUMNS
    WHERE TABLE_NAME = 'users'
    AND COLUMN LIKE 'persoonlijk_%'
)
FROM 'users'

[ Voor 19% gewijzigd door Verwijderd op 17-12-2007 12:06 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 17 december 2007 @ 12:06:
[...]

Als dat kan, dan kan je toch ook een subquery maken?
SQL:
1
2
3
4
5
6
7
SELECT (
    SELECT COLUMN_NAME
    FROM COLUMNS
    WHERE TABLE_NAME = 'users'
    AND COLUMN LIKE 'persoonlijk_%'
)
FROM 'users'
Als dat werkt vreet ik.... euh... het lijkt me stug dat dat werkt :+
voordat ik hier straks oude sokken zit te eten :X en bij MySQL weet je nooit :X

[ Voor 10% gewijzigd door RobIII op 17-12-2007 12:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 10:04
Nee want mysql zal de uitvoer van die subquery niet herkennen als veldnamen maar als varchar(64) strings. Je moet daar dus zelf nog omheen scripten.

Verwijderd

Dan zou het toch mooi zijn als SQL formatteer-functies zoals AND() en COMMA() zou kennen (waarbij er respectievelijk "AND"s en ","s tussen de strings worden gezet. Dat maakt SQL een stuk expressiever.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Stuk expressiever ja, met features welke maar al te makkelijk tot erg ranzige queries leiden. Iedereen vind 'select *' evil, maar 'select persoonlijk*' (als het zou werken ;) ) is gewoon om dezelfde redenen slecht. Je wil alleen relevante kolommen ophalen in je queires. Als er meer kolommen bijkomen met een 'persoonlijk'-prefix, wil je die niet per se in al je oude queries meeselecteren.

Ergo: kritisch kijken naar datamodel, dat kan natuurlijk nooit kwaad. Gebruik als je het per se nodig hebt een meta query om een lijstje kolomnamen te bouwen, die je vervolgens in je code kan plakken.

{signature}


  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 28-11 18:54
Verder nog de vraag:
Hoe wil je die persoonlijke gegevens koppelen aan een persoon?
Dat kan alleen als je in de WHERE clausule de ID van de tabel opneemt.

Wat makkelijker is om dan SELECT * te doen en in je code alleen de relevante kolommen te gebruiken/verwerken.

let the past be the past.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Que? Waarom niet eenmalig de moeite doen om gewoon expliciet de gewenste kolommen te specificeren?
SPee schreef op maandag 17 december 2007 @ 14:34:
Wat makkelijker is om dan SELECT * te doen en in je code alleen de relevante kolommen te gebruiken/verwerken.
WHERE is ook maar lastig, dus dat kan ook in code. :/
Als je per se automatisch kolommen met die prefix wil selecteren, doe dan gewoon eerst die query naar meta info.

{signature}

Pagina: 1