OVH Cloud OVH Cloud

SELECT concaténés avec champs réordonnés

2 réponses
Avatar
Jérémy JUST
Bonjour,

Je suis un grand novice en SQL, et j'ai l'impression d'avoir un problème
de base.

Sous PostgreSQL 8.1, j'ai cette table:

=> SELECT * FROM test ;
test_id | val1 | val2
---------+-----------+-----------
37 | valeur1_1 | valeur2_2
38 | valeur1_2 | valeur2_3
39 | valeur1_3 | valeur2_4
40 | valeur1_4 | valeur2_5
41 | valeur1_5 | valeur2_6
42 | valeur1_6 | valeur2_7

Les colonnes val1 et val2 contiennent des données de même nature, et
leur ordre ( val1,val2 ou val2,val1 ) est arbitraire.
Je voudrais pouvoir faire des SELECT en tenant compte de ce fait. Une
requêtes pourrait ressembler à ça:

=> SELECT getvalues( '%_5' ) ; -- Syntaxe imaginaire
test_id | val1 | val2
---------+-----------+-----------
40 | valeur2_5 | valeur1_4
41 | valeur1_5 | valeur2_6

^^^^^^^^^ ^^^^^
Ici la valeur Ici, l'autre valeur
de val1 OU val2
qui matche


J'ai pensé à une vue qui présenterait les données de la table test en
double:
val1 | val2
----------+-----------
valeur1_1 | valeur2_2
valeur1_2 | valeur2_3
valeur1_3 | valeur2_4
valeur1_4 | valeur2_5
valeur1_5 | valeur2_6
valeur1_6 | valeur2_7
valeur2_2 | valeur1_1
valeur2_3 | valeur1_2
valeur2_4 | valeur1_3
valeur2_5 | valeur1_4
valeur2_6 | valeur1_5
valeur2_7 | valeur1_6

mais mes essais se heurtent à des échecs.



Sinon, j'avais pensé à une fonction comme ça, mais les deux SELECT ne
sont pas concaténés:

CREATE FUNCTION getvalues( text ) RETURNS SETOF test AS $$
SELECT test_id, val1, val2 FROM test WHERE val1 LIKE $1 ;
SELECT test_id, val2, val1 FROM test WHERE val2 LIKE $1 ;
$$ LANGUAGE SQL ;


Auriez-vous des idées?


--
Jérémy JUST <jeremy_just@netcourrier.com>

2 réponses

Avatar
ALain Montfranc
=?ISO-8859-15?Q?Jérémy?= JUST a écrit
Bonjour,

Je suis un grand novice en SQL, et j'ai l'impression d'avoir un problème
de base.

Sous PostgreSQL 8.1, j'ai cette table:

=> SELECT * FROM test ;
test_id | val1 | val2
---------+-----------+-----------
37 | valeur1_1 | valeur2_2
38 | valeur1_2 | valeur2_3
39 | valeur1_3 | valeur2_4
40 | valeur1_4 | valeur2_5
41 | valeur1_5 | valeur2_6
42 | valeur1_6 | valeur2_7

Les colonnes val1 et val2 contiennent des données de même nature, et
leur ordre ( val1,val2 ou val2,val1 ) est arbitraire.
Je voudrais pouvoir faire des SELECT en tenant compte de ce fait. Une
requêtes pourrait ressembler à ça:

=> SELECT getvalues( '%_5' ) ; -- Syntaxe imaginaire
test_id | val1 | val2
---------+-----------+-----------
40 | valeur2_5 | valeur1_4
41 | valeur1_5 | valeur2_6




Cree ta vue sur la requette du style :

select id, val1, val2 from table
union
select id, val2, val1 from table
Avatar
Jérémy JUST
On Fri, 16 Feb 2007 15:28:37 +0100
ALain Montfranc wrote:

=> SELECT getvalues( '%_5' ) ; -- Syntaxe imaginaire
test_id | val1 | val2
---------+-----------+-----------
40 | valeur2_5 | valeur1_4
41 | valeur1_5 | valeur2_6




Cree ta vue sur la requette du style :

select id, val1, val2 from table
union
select id, val2, val1 from table



Merci! Ça correspond exactement à ce que je voulais.

J'ai donc créé une vue:

=> CREATE VIEW myview AS (SELECT test_id, val1, val2 FROM test)
UNION (SELECT test_id, val2, val1 FROM test) ;


Ce qui me permet:

=> SELECT * FROM myview WHERE val1 LIKE '%_5' ;
test_id | val1 | val2
---------+-----------+-----------
40 | valeur2_5 | valeur1_4
41 | valeur1_5 | valeur2_6
(2 rows)


Encore merci pour cette réponse rapide et très pertinente.

--
Jérémy JUST