Pergunta

Tenho um problema muito simples que não consigo resolver. Eu preciso fazer algo assim:

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

Alguém pode ajudar ??

Editar

Os dados são como um arquivo de texto de um de nossos clientes. É totalmente não formado (é uma única linha de texto muito longa), mas pode ser possível fazê -lo no Excel. Mas não é prático para mim, porque precisarei usar esses valores na minha consulta SQL. Não é conveniente fazê -lo toda vez que preciso executar uma consulta.

Foi útil?

Solução

Maneira mais simples de obter o Valores distintos de uma longa lista de texto delimitado por vírgula seria usar um encontro de substituição por UNIÃO Para obter os valores distintos.

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

Aplicado à sua longa linha de texto delimitado por vírgula

  • Encontre e substitua cada vírgula por UNION SELECT
  • Adicione a SELECT em frente à declaração

Você agora deveria ter uma consulta de trabalho

Outras dicas

Disponível apenas no SQL Server 2008 e over é o constitutor de linha neste formulário:
Você poderia usar

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

Muitos escreveram sobre, entre eles:

No geral :

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 )

No seu caso :

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

Você já tentou usar a seguinte sintaxe?

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

Se você deseja selecionar apenas certos valores de uma única tabela, você pode tentar isso

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

por exemplo:

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

Se você deseja selecionar de várias tabelas, deve optar por UNION.

Se você deseja apenas selecionar os valores 1, 1, 1, 2, 5, 1, 6, então você deve fazer isso

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

PostgreSQL oferece 2 maneiras de fazer isso:

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)

Usando a abordagem da matriz, você também pode fazer algo assim:

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

Isso funciona no SQL Server 2005 e se houver número máximo:

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 você precisar de uma matriz, separe as colunas da matriz com uma vírgula:

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

Outra maneira que você pode usar é uma consulta como esta:

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

Eu sei que este é um tópico bastante antigo, mas eu estava procurando algo semelhante e criei isso.

Dado que você tinha uma corda separada por vírgula, você pode usar string_split

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

Isso deve retornar

1
2
5
6

String Split leva dois parâmetros, a entrada da string e o caractere separador.

você pode adicionar uma declaração opcional onde usando value como o nome da coluna

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

produz

2
5
6

Uma técnica que funcionou para mim é consultar uma tabela que você sabe que tem uma grande quantidade de registros, incluindo apenas o campo row_number em seu resultado

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

Retornará um conjunto de resultados de 10000 registros de 1 a 10000, use -o dentro de outra consulta para fornecer os resultados desejados

Use o SQL In função

Algo assim:

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

Funciona um deleite em Arcgis

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top