web-dev-qa-db-fra.com

Comment sélectionner une liste de valeurs dans SQL Server

J'ai un problème très simple que je ne peux pas résoudre. J'ai besoin de faire quelque chose comme ça:

select distinct * from (1, 1, 1, 2, 5, 1, 6).

Tout le monde peut aider?

Éditer

Les données sont fournies sous la forme d’un fichier texte de l’un de nos clients. Il est totalement non formaté (c'est une simple et très longue ligne de texte), mais il est peut-être possible de le faire dans Excel. Mais ce n'est pas pratique pour moi, car je devrai utiliser ces valeurs dans ma requête SQL. Ce n'est pas pratique de le faire chaque fois que j'ai besoin d'exécuter une requête.

183
Eedoh

Le moyen le plus simple d’obtenir les valeurs distinctes d’une longue liste de texte délimité par des virgules consisterait à rechercher un remplacement par UNION pour obtenir les valeurs distinctes.

SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
UNION SELECT 1
UNION SELECT 6

Appliqué à votre longue ligne de texte délimité par des virgules

  • Recherchez et remplacez chaque virgule par UNION SELECT
  • Ajouter un SELECT devant la déclaration

Vous devriez maintenant avoir une requête de travail

72

Disponible uniquement sur SQL Server 2008 et versions supérieures, le constructeur de lignes se présente sous cette forme:
Vous pouvez utiliser

SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)

Beaucoup ont écrit sur, parmi eux:

373
pm.

En général :

SELECT 
  DISTINCT 
      FieldName1, FieldName2, ..., FieldNameN
FROM
  (
    Values
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN ),
        ( ValueForField1, ValueForField2,..., ValueForFieldN )
  ) AS TempTableName ( FieldName1, FieldName2, ..., FieldNameN )

Dans ton cas :

Select 
  distinct
  TempTableName.Field1 
From 
  (
  VALUES
    (1), 
    (1), 
    (1), 
    (2), 
    (5), 
    (1), 
    (6)
  ) AS TempTableName (Field1)
58
Ardalan Shahgholi

Avez-vous essayé d'utiliser la syntaxe suivante?

select * from (values (1), (2), (3), (4), (5)) numbers(number)
39
Robba

Si vous souhaitez sélectionner uniquement certaines valeurs dans une seule table, vous pouvez essayer ceci.

select distinct(*) from table_name where table_field in (1,1,2,3,4,5)

par exemple:

select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)

si vous voulez sélectionner plusieurs tables, vous devez choisir UNION.

Si vous voulez juste sélectionner les valeurs 1, 1, 1, 2, 5, 1, 6 alors vous devez le faire

select 1 
union select 1 
union select 1 
union select 2 
union select 5 
union select 1 
union select 6
19
Anirudh Goel

PostgreSQL vous offre 2 façons de procéder:

SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)

ou

SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)

en utilisant une approche de tableau, vous pouvez également faire quelque chose comme ceci:

SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)
13
Arek

Cela fonctionne sur SQL Server 2005 et s'il y a un nombre maximal:

SELECT * 
FROM
  (SELECT ROW_NUMBER() OVER(ORDER BY a.id) NUMBER
  FROM syscomments a
  CROSS JOIN syscomments b) c
WHERE c.NUMBER IN (1,4,6,7,9)
9
LukLed

Si vous avez besoin d'un tableau, séparez les colonnes du tableau par une virgule:

SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])
1
gilgarola

Je sais que c'est un très vieux fil, mais je cherchais quelque chose de similaire et je l'ai trouvé.

Étant donné que vous avez une chaîne séparée par des virgules, vous pouvez utiliser string_split

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')

Cela devrait retourner

1
2
5
6

Le fractionnement de chaîne prend deux paramètres, l'entrée de chaîne et le caractère de séparation.

vous pouvez ajouter une instruction where optionnelle en utilisant value comme nom de colonne

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
where value > 1

produit

2
5
6
0
NapkinBob

Une autre façon d'utiliser une requête est la suivante:

SELECT DISTINCT
    LTRIM(m.n.value('.[1]','varchar(8000)')) as columnName
FROM 
    (SELECT CAST('<XMLRoot><RowData>' + REPLACE(t.val,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
     FROM (SELECT '1, 1, 1, 2, 5, 1, 6') AS t(val)
    ) dt
  CROSS APPLY 
    x.nodes('/XMLRoot/RowData') m(n);
0
shA.t