Frage

Ich habe ein sehr einfaches Problem, das ich nicht lösen kann. Ich muss so etwas tun:

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

Kann jemand helfen ??

Bearbeiten

Die Daten kommen als Textdatei von einem unserer Clients. Es ist völlig unformatiert (es ist eine einzige, sehr lange Textzeile), aber es kann möglich sein, dies in Excel zu tun. Aber es ist nicht praktisch für mich, weil ich diese Werte in meiner SQL -Abfrage verwenden muss. Es ist nicht bequem, dies jedes Mal zu tun, wenn ich eine Frage ausführen muss.

War es hilfreich?

Lösung

Einfachste Art, die zu bekommen Unterschiedliche Werte einer langen Liste von Komma -Abgrenztext wäre sein, einen Fund einen Ersatz durch zu verwenden UNION um die unterschiedlichen Werte zu erhalten.

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

Angewendet auf Ihre lange Linie von Comma -Abgrenzten

  • Finden und ersetzen Sie jedes Komma durch UNION SELECT
  • Füge hinzu ein SELECT vor der Aussage

Sie sollten jetzt eine funktionierende Frage haben

Andere Tipps

Nur auf SQL Server 2008 und Over erhältlich ist Zeilenkonstruktor in dieser Form:
Du könntest benutzen

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

Viele schrieben unter ihnen:

Im Algemeinen :

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 )

In Ihrem Fall :

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

Haben Sie versucht, die folgende Syntax zu verwenden?

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

Wenn Sie nur bestimmte Werte aus einer einzelnen Tabelle auswählen möchten, können Sie dies versuchen

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

z.B:

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

Wenn Sie aus mehreren Tabellen auswählen möchten, müssen Sie sich entscheiden UNION.

Wenn Sie nur die Werte 1, 1, 1, 2, 5, 1, 6 auswählen möchten, müssen Sie dies tun

select 1 
union select 1 
union select 1 
union select 2 
union select 5 
union select 1 
union select 6

PostgreSQL gibt Ihnen 2 Möglichkeiten, dies zu tun:

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

oder

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

Mit dem Array -Ansatz können Sie auch so etwas tun:

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

Dies funktioniert auf SQL Server 2005 und wenn es eine maximale Anzahl gibt:

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)

Wenn Sie ein Array benötigen, trennen Sie die Array -Spalten mit einem Komma:

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

Eine andere Möglichkeit, die Sie verwenden können, ist eine solche Abfrage:

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);

Ich weiß, dass dies ein ziemlich alter Thread ist, aber ich habe nach etwas Ähnlichem gesucht und mir das ausgedacht.

Angesichts der Tatsache, dass Sie eine von Kommas getrennte Zeichenfolge hatten, konnten Sie verwenden string_split

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

Dies sollte zurückkehren

1
2
5
6

String Split erfordert zwei Parameter, die String -Eingabe und das Separatorzeichen.

Sie können eine optionale Where -Anweisung hinzufügen value als Spaltenname

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

produziert

2
5
6

Eine Technik, die für mich funktioniert hat, besteht darin, eine Tabelle abzufragen, von der Sie wissen

Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable

Gibt einen Ergebnissatz von 10000 Datensätzen von 1 bis 10000 zurück. Verwenden Sie diese innerhalb einer anderen Abfrage, um Ihnen die gewünschten Ergebnisse zu erzielen

Verwenden Sie die SQL In Funktion

Etwas wie das:

SELECT * FROM mytable WHERE:
"VALUE" In (1,2,3,7,90,500)

Arbeitet einen Leckerbissen in Arcgis

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top