Je cherche à mettre en place une requête SQL pour une table de type matrice pour sélectionner une certaine valeur (qui peut apparaître dans l'une ou l'autre colonne), puis basculer les colonnes id afin que la valeur de recherche apparaisse toujours sur le côté gauche.

J'ai du mal à l'expliquer de manière cohérente pour rechercher une réponse, mais voici un exemple:

Table DB

id1 | id2 | value
----|-----|-------
 1  |  4  |  0.2
 2  |  1  |  0.3
 3  |  1  |  0.5
 2  |  3  |  0.1

Sortie souhaitée si je recherche la valeur 1, notez la position de commutation des deux dernières colonnes:

id1 | id2 | value
----|-----|-------
 1  |  4  |  0.2
 1  |  2  |  0.3   
 1  |  3  |  0.5

Mon SQL actuel est le suivant:

SELECT (id1, id2, value) FROM db-table WHERE 1 in (id1, id2);

Qui obtient les valeurs correctes, mais sans permutation. Le résultat est:

id1 | id2 | value
----|-----|-------
 1  |  4  |  0.2
 2  |  1  |  0.3   
 3  |  1  |  0.5

J'utilise sqlite3 mais je peux traduire / résoudre des problèmes spécifiques à un domaine si quelqu'un est capable de me diriger dans la bonne direction. Merci!

1
mbdavis 16 nov. 2017 à 14:16

4 réponses

Meilleure réponse

Vous pouvez utiliser la requête ci-dessous. Son fonctionne bien.

créer et insérer des valeurs

create table #table1
(
   id1 int,
   id2 int,
   val nvarchar(20)
)

insert into #table1 values (1,4,0.2);
insert into #table1 values (2,1,0.3);
insert into #table1 values (3,1,0.5);
insert into #table1 values (2,3,0.1);

écrire ci-dessous la requête pour obtenir le résultat

select * from (
                 SELECT id1 ,id2, val FROM #table1 where id1 = 1
                 union 
                 SELECT id2 ,id1, val from #table1 where id2 = 1
              ) t 
order by t.val asc

voilà le résultat.

enter image description here

~ acclamations

2
Eray Balkanli 3 avril 2019 à 21:11

Vous voulez dire quelque chose de plus comme:

SELECT * FROM
(
 SELECT 
  CASE WHEN id1 < id2 THEN id1 ELSE id2 END as id1,
  CASE WHEN id1 < id2 THEN id2 ELSE id1 END as id2,
  value
 FROM db-table 
) a
WHERE id1 = 1
ORDER BY value
-1
Caius Jard 16 nov. 2017 à 11:21

Est-ce que ça fait ce que tu veux,

Select IIF(id1<=id2,id1,id2) id1, iif(id1>id2,id1,id2) id2,value
From table 

Si IIF n'est pas valide dans l'instruction SQLite, essayez CASE.

Select case when id1<=id2 then id1 else id2 end id1,
       Case when id1>id2  then id1 else id2 end id2
From table
Where 1 in (id1,id2)
0
Ab Bennett 16 nov. 2017 à 11:33

Quelque chose comme ça:

select 1 as id1,
       (case when id1 = 1 then id2 else id1 end) as id2,
       value
from t
where 1 in (id1, id2)
order by value;
1
Gordon Linoff 16 nov. 2017 à 11:21
47328282