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.
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
UNION SELECT
SELECT
devant la déclarationVous devriez maintenant avoir une requête de travail
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:
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)
Avez-vous essayé d'utiliser la syntaxe suivante?
select * from (values (1), (2), (3), (4), (5)) numbers(number)
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
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)
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)
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])
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
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);