Comment puis-je choisir parmi une liste de valeurs dans SQL Server
-
21-09-2019 - |
Question
J'ai un problème très simple que je ne peux pas résoudre. Je dois faire quelque chose comme ceci:
select distinct * from (1, 1, 1, 2, 5, 1, 6).
Tout le monde peut aider ??
Modifier
Les données se présente comme un fichier texte d'un de nos clients. Il est tout à fait non formaté (il est un seul, très longue ligne de texte), mais il peut être possible de le faire dans Excel. Mais ce n'est pas pratique pour moi, parce que je vais avoir besoin d'utiliser ces valeurs dans ma requête SQL. Ce n'est pas pratique de le faire à chaque fois que je dois exécuter une requête.
La solution
Simplest façon d'obtenir les longues valeurs distinctes d'une liste de texte délimité par des virgules serait d'utiliser un trouver un remplacer 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
- Rechercher et remplacer chaque virgule avec
UNION SELECT
- Ajouter un
SELECT
devant la déclaration
Vous devriez maintenant avoir une requête de travail
Autres conseils
Disponible uniquement sur SQL Server 2008 et plus est rangée constructeur sous cette forme:
Vous pouvez utiliser
SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)
Beaucoup ont écrit au sujet, 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 votre 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 voulez sélectionner uniquement certaines valeurs à partir d'une seule table, vous pouvez essayer
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 alors vous devez aller pour 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 donne 2 façons de le faire:
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 l'approche du tableau, vous pouvez aussi 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 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éparer les colonnes du tableau par une virgule:
SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])
Une autre façon que vous pouvez utiliser est une requête comme ceci:
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);
Je sais que c'est un fil assez vieux, mais je cherchais quelque chose de similaire et est venu avec cela.
Étant donné que vous avez eu 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 revenir
1
2
5
6
scission de chaîne prend deux paramètres, l'entrée de chaîne, et le caractère de séparation.
vous pouvez ajouter une option où instruction à l'aide 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 technique qui a travaillé pour moi est d'interroger une table que vous connaissez a une grande quantité d'enregistrements, y compris tout le champ ROW_NUMBER dans votre résultat
Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable
renvoie un ensemble de résultats de 10000 enregistrements de 1 à 10000, utiliser dans une autre requête pour vous donner les résultats souhaités
Utilisez la fonction In
SQL
Quelque chose comme ceci:
SELECT * FROM mytable WHERE:
"VALUE" In (1,2,3,7,90,500)
Works un traitement dans ArcGIS