Como posso selecionar da lista de valores no SQL Server
-
21-09-2019 - |
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.
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