Wie kann ich aus der Liste der Werte in SQL Server auswählen?
-
21-09-2019 - |
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.
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