2009-10-14 10 views
115

Tengo un problema muy simple que no puedo resolver. Necesito hacer algo como esto:¿Cómo puedo seleccionar de la lista de valores en SQL Server?

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

¿Alguien puede ayudar?

Editar

Los datos se presenta como un archivo de texto de uno de nuestros clientes. Está totalmente sin formatear (es una sola línea de texto muy larga), pero puede ser posible hacerlo en Excel. Pero no es práctico para mí, porque tendré que usar estos valores en mi consulta SQL. No es conveniente hacerlo cada vez que necesito ejecutar una consulta.

+0

¿Desea seleccionar de varias tablas o seleccionar de una sola tabla pero que tiene valores específicos para seleccionar? algo así como identificadores específicos solos –

+0

No es lo que preguntas, pero puedes hacerlo en otro idioma.Por ejemplo, en PowerShell, puede hacer '$ d = (1, 1, 1, 2, 5, 1, 6) | sort -Unique' para obtener los valores distintos en una matriz '$ d'. Fácil de extender a una herramienta de archivo a archivo. –

Respuesta

59

forma más sencilla de obtener los valores distintos de una larga lista de coma de texto delimitado sería utilizar un encontrar una reemplazan con UNION para obtener los valores distintos.

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

aplicado a su larga lista de delimitado por comas texto

  • buscar y reemplazar cada coma con UNION SELECT
  • Añadir un SELECT delante de la declaración

Ahora debería tener una consulta de trabajo

+2

no, no, tengo una lista de varios cientos de valores, manualmente sería una tortura – Eedoh

+0

¿De dónde viene esa lista? Puede ser mucho más fácil simplemente copiar/pegar esa lista en Excel y extraer los distintos valores allí usando una tabla cruzada simple. –

+0

Por cierto, buscar y reemplazar también puede llevarte un largo camino. Reemplace todas las comas con * union select *, agregue una selección al frente y debería tener una consulta que funcione cfr la unión que mostré. –

16

Si quieres seleccionar sólo ciertos valores de una sola tabla puede probar esta

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

por ejemplo:

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

si desea seleccionar de varias tablas a continuación, usted debe ir para UNION.

Si lo que desea es seleccionar los valores de 1, 1, 1, 2, 5, 1, 6 entonces usted debe hacer esto

select 1 
union select 1 
union select 1 
union select 2 
union select 5 
union select 1 
union select 6 
+0

No necesito seleccionar de una tabla, sino de esta lista de valores (entre paréntesis). Ese es el problema principal (seleccionar de un conjunto de valores separados por comas, no de una tabla) – Eedoh

+0

ese caso, al igual que tenemos la tabla DUAL en Oracle, puede hacer uso de la misma. Pero como no hay DUAL, entonces deberá seguir el camino de la unión. Puede probar con otro método, ya que mencionó que tiene una matriz de valores separados por comas, ¿por qué no los inserta en una tabla y luego utiliza una consulta de selección de SQL puro, en lugar de utilizar tantas uniones de sql? –

9

Esto funciona en SQL Server 2005 y si hay 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) 
+1

+1 limpio, pero está limitado a la cantidad de filas en syscomments cross se unió a sí mismo. En mi caso a 294849. (y olvidaste distinto.) –

+0

Puedes unir una vez más, pero reemplazar las comas es una solución mucho más rápida. – LukLed

+0

Sí, esta manera también es buena, pero prefiero la solución de Lieven, por su simplicidad. – Eedoh

248

Disponible sólo en SQL Server 2008 y otra fila es constructor en esta forma:
usted podría utilizar

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

Muchos escribieron sobre, entre ellos:

+28

Nota al margen: 'X' es un alias para el nombre de la tabla y' a' es un alias para el nombre de la columna;). –

+4

Esta es la respuesta más correcta en comparación con la actualmente seleccionada –

+0

Esta es la forma más genérica, me dañó unnest (ARRAY []) en 'pgsql' y ahora golpeando la cabeza para hacer que FROM acepte valores menores como registros de filas en' sqlserver', y aquí está. Feliz de saber. – Ben

9

PostgreSQL le da 2 maneras de hacer esto:

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) 

utilizando el enfoque conjunto también se puede hacer algo como esto:

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

Aunque la pregunta especifica MSSQL ... ':)' – halfer

-1

Una técnica que ha trabajado para mí es para consultar una tabla que usted conoce tiene una gran cantidad de registros en el mismo, incluyendo sólo el campo ROW_NUMBER en su consecuencia

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

devolverá un conjunto de resultados de 10000 registros de 1 a 10.000, utilizar esto dentro de otra consulta para darle los resultados deseados

-1

uso de la diversión SQL In cción

Algo como esto:

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

trabaja un convite en ArcGIS

+0

Este SELECT genera un error de sintaxis con SQL Server. – JohnH

32

¿Ha intentado utilizar la siguiente sintaxis?

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

un usuario anónimo sugirió editar el código para: 'SELECT DISTINCT table_name.column_name FROM (VALUES (1), (2), (3)) AS table_name (column_name)' – Vogel612

0

Otra forma en que se puede utilizar es una 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); 
24

En general:

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) 

En su caso:

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

Si necesita una matriz, separe las columnas de la matriz con una coma:

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