Come posso selezionare dall'elenco dei valori in SQL Server
-
21-09-2019 - |
Domanda
Ho un problema molto semplice che non riesco a risolvere. Devo fare qualcosa del genere:
select distinct * from (1, 1, 1, 2, 5, 1, 6).
Qualcuno può aiutare ??
Modificare
I dati sono disponibili come un file di testo da uno dei nostri clienti. È totalmente non formattato (è una linea di testo singola, molto lunga), ma potrebbe essere possibile farlo in Excel. Ma non è pratico per me, perché dovrò usare questi valori nella mia query SQL. Non è conveniente farlo ogni volta che ho bisogno di eseguire una domanda.
Soluzione
Modo più semplice per ottenere il Valori distinti di un lungo elenco di testo delimitato da virgola sarebbe usare una ricerca in sostituzione con UNIONE Per ottenere i valori distinti.
SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
UNION SELECT 1
UNION SELECT 6
Applicato al testo delimitato della lunga linea di virgola
- Trova e sostituisci ogni virgola con
UNION SELECT
- Aggiungere un
SELECT
Di fronte alla dichiarazione
Ora dovresti avere una domanda di lavoro
Altri suggerimenti
Disponibile solo su SQL Server 2008 e oltre è costruttore di righe in questo modulo:
Potresti usare
SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)
Molti hanno scritto, tra questi:
In generale :
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 )
Nel tuo caso :
Select
distinct
TempTableName.Field1
From
(
VALUES
(1),
(1),
(1),
(2),
(5),
(1),
(6)
) AS TempTableName (Field1)
Hai provato a utilizzare la seguente sintassi?
select * from (values (1), (2), (3), (4), (5)) numbers(number)
Se si desidera selezionare solo determinati valori da una singola tabella, puoi provarlo
select distinct(*) from table_name where table_field in (1,1,2,3,4,5)
per esempio:
select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)
Se si desidera selezionare da più tabelle, devi andare UNION
.
Se vuoi solo selezionare i valori 1, 1, 1, 2, 5, 1, 6, allora devi farlo
select 1
union select 1
union select 1
union select 2
union select 5
union select 1
union select 6
PostgreSQL ti dà 2 modi per farlo:
SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)
o
SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)
Usando l'approccio array puoi anche fare qualcosa del genere:
SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)
Funziona su SQL Server 2005 e se esiste un numero massimo:
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)
Se hai bisogno di un array, separa le colonne dell'array con una virgola:
SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])
Un altro modo che puoi usare è una domanda come questa:
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);
So che questo è un thread piuttosto vecchio, ma stavo cercando qualcosa di simile e lo ho inventato.
Dato che avevi una corda separata da virgola, potresti usare string_split
select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
Questo dovrebbe tornare
1
2
5
6
String Split prende due parametri, l'ingresso della stringa e il carattere separatore.
È possibile aggiungere un'istruzione opzionale in cui utilizzando value
Come nome della colonna
select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
where value > 1
produce
2
5
6
Una tecnica che ha funzionato per me è quella di interrogare un tavolo che sai ha una grande quantità di record, incluso solo il campo di row_number nel tuo risultato
Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable
restituirà un set di risultati di 10000 record da 1 a 10000, usa questo in un'altra query per darti i risultati desiderati
Usa SQL In
funzione
Qualcosa come questo:
SELECT * FROM mytable WHERE:
"VALUE" In (1,2,3,7,90,500)
Funziona una sorpresa in arcGIS