¿Cómo puedo seleccionar entre la lista de valores en SQL Server?
-
21-09-2019 - |
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.
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