我如何从SQL Server中的值列表中进行select
我有非常简单的问题,我无法解决。 我需要做这样的事情:
select distinct * from (1, 1, 1, 2, 5, 1, 6).
任何人都可以帮忙?
编辑
数据来自我们的客户之一的文本文件。 这是完全没有格式的(这是一个单一的,很长的文本行),但它可能会在Excel中这样做。 但这对我来说并不实际,因为我需要在我的sql查询中使用这些值。 每次我需要运行一个查询都不方便。
获取逗号分隔文本的长列表的不同值的最简单方法是使用UNION的查找replace来获取不同的值。
SELECT 1 UNION SELECT 1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 5 UNION SELECT 1 UNION SELECT 6
应用于您的逗号分隔文本的长行
- 使用
UNION SELECT
查找并replace每个逗号 - 在语句前添加一个
SELECT
你现在应该有一个工作查询
仅适用于SQL Server 2008及以上版本是以这种forms的行构造函数:
你可以使用
SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)
其中有许多写道:
你有没有尝试过使用下面的语法?
select * from (values (1), (2), (3), (4), (5)) numbers(number)
一般来说 :
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)
在你的情况下:
Select distinct TempTableName.Field1 From ( VALUES (1), (1), (1), (2), (5), (1), (6) ) AS TempTableName (Field1)
如果你想从一个表中只select某些值,你可以试试这个
select distinct(*) from table_name where table_field in (1,1,2,3,4,5)
例如:
select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)
如果你想从多个表中select,那么你必须去UNION
。
如果你只想select值1,1,1,2,5,1,6,那么你必须这样做
select 1 union select 1 union select 1 union select 2 union select 5 union select 1 union select 6
这适用于SQL Server 2005,如果有最大数量:
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)
PostgreSQL为您提供了两种方法:
SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)
要么
SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)
使用数组方法,你也可以做这样的事情:
SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)
使用SQL In
函数
像这样的东西:
SELECT * FROM mytable WHERE: "VALUE" In (1,2,3,7,90,500)
在ArcGIS中工作
另一种可以使用的方法是这样的查询:
SELECT DISTINCT LTRIM(mnvalue('.[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);
如果你需要一个数组,用逗号分隔数组列:
SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute]) ,(VALUES(742),(318)) AS z([StoreID])
对我来说,一个技巧就是查询一个你知道有大量logging的表,包括结果中的Row_Number字段
Select Top 10000 Row_Number() OVER (Order by fieldintable) As 'recnum' From largetable
将返回1到10000的10000个logging的结果集,在另一个查询中使用这个结果集来给出你想要的结果