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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top