Pregunta

Tengo un problema muy simple que no puedo resolver. Necesito hacer algo como esto:

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

¿Alguien puede ayudar?

Editar

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

¿Fue útil?

Solución

Forma más sencilla de obtener el Valores distintos de una larga lista de texto delimitado por comas sería usar un reemplazo de Find y UNIÓN 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 línea de texto delimitado por coma

  • Encontrar y reemplazar cada coma con UNION SELECT
  • Agrega un SELECT frente a la declaración

Ahora debería tener una consulta de trabajo

Otros consejos

Disponible solo en SQL Server 2008 y más es el constructor de filas en este formulario:
Podrías usar

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

Muchos escribieron sobre, entre ellos:

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 tu caso :

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

¿Has intentado usar la siguiente sintaxis?

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

Si desea seleccionar solo ciertos valores de una sola tabla, puede probar esto

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

p.ej:

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

Si desea seleccionar entre varias tablas, entonces debe ir UNION.

Si solo desea seleccionar los valores 1, 1, 1, 2, 5, 1, 6, entonces debe hacer esto

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

PostgreSQL te da 2 formas 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)

Usando el enfoque de matriz, también 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)

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

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

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

Otra forma en que puedes usar 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);

Sé que este es un hilo bastante antiguo, pero estaba buscando algo similar y se le ocurrió esto.

Dado que tenía una cadena separada por comas, podría usar string_split

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

Esto debería volver

1
2
5
6

String Split toma dos parámetros, la entrada de cadena y el carácter del separador.

Puede agregar una declaración opcional donde usa value Como el nombre de la columna

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

produce

2
5
6

Una técnica que me ha funcionado es consultar una mesa que sabe que tiene una gran cantidad de registros, incluido solo el campo ROW_Number en su resultado

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

devolverá un conjunto de resultados de 10000 registros de 1 a 10000, use esto dentro de otra consulta para brindarle los resultados deseados

Usa el SQL In función

Algo como esto:

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

Trabaja un regalo en Arcgis

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top