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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top