270

我有一个非常简单的问题,我无法解决。我需要做这样的事情:

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

有人可以帮忙吗??

编辑

数据来自我们的一位客户的文本文件。它完全没有格式化(它是一个非常长的单行文本),但在 Excel 中可以这样做。但这对我来说并不实用,因为我需要在我的 sql 查询中使用这些值。每次我需要运行查询时都这样做并不方便。

4

16 回答 16

530

仅在 SQL Server 2008 及更高版本上可用的是这种形式的行构造函数:
您可以使用

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

有关更多信息,请参阅:

于 2011-09-02T14:39:51.827 回答
118

一般来说 :

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)
于 2016-01-29T20:48:35.207 回答
100

获取一长串逗号分隔文本的不同值的最简单方法是使用查找替换UNION来获取不同的值。

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

应用于您的长行逗号分隔文本

  • 查找并替换每个逗号UNION SELECT
  • SELECT在语句前面加一个

您现在应该有一个有效的查询

于 2009-10-14T08:24:07.713 回答
44

您是否尝试过使用以下语法?

select * from (values (1), (2), (3), (4), (5)) numbers(number)
于 2014-12-12T11:45:59.553 回答
19

如果您只想从单个表中选择某些值,您可以试试这个

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)

如果您想从多个表中进行选择,那么您必须选择UNION.

如果您只想选择值 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
于 2009-10-14T08:26:02.550 回答
19

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)
于 2012-08-01T20:00:12.173 回答
9

这适用于 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)
于 2009-10-14T08:36:01.840 回答
6

我知道这是一个非常古老的线程,但我正在寻找类似的东西并想出了这个。

鉴于您有一个逗号分隔的字符串,您可以使用string_split

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

这应该返回

1
2
5
6

字符串拆分有两个参数,字符串输入和分隔符。

value您可以使用作为列名添加可选的 where 语句

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

生产

2
5
6
于 2018-12-26T14:48:57.520 回答
2

如果需要数组,请用逗号分隔数组列:

SELECT * FROM (VALUES('WOMENS'),('MENS'),('CHILDRENS')) as X([Attribute])
,(VALUES(742),(318)) AS z([StoreID])
于 2017-09-15T16:48:19.110 回答
2

UsingGROUP BYDISTINCT

SELECT *
FROM
(
    VALUES
        (1),
        (1),
        (1),
        (2),
        (5),
        (1),
        (6)
) AS A (nums)
GROUP BY A.nums;
于 2021-09-03T13:57:24.083 回答
1

从用户 ID 列表中选择用户 ID:

SELECT * FROM my_table WHERE user_id IN (1,3,5,7,9,4);
于 2020-03-07T05:34:41.620 回答
0

您可以使用的另一种方法是这样的查询:

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);
于 2015-12-26T07:34:07.617 回答
0

如果它是现有 SQL 表中的参数列表,例如现有 Table1 中的 ID 列表,那么您可以尝试以下操作:

select distinct ID
      FROM Table1
      where 
      ID in (1, 1, 1, 2, 5, 1, 6)
ORDER BY ID;

或者,如果您需要将参数列表作为 SQL 表常量(变量),请尝试以下操作:

WITH Id_list AS (
     select ID
      FROM Table1
      where 
      ID in (1, 1, 1, 2, 5, 1, 6)
)
SELECT distinct * FROM Id_list
ORDER BY ID;
于 2020-11-18T06:27:17.837 回答
0

我在我工作的大多数 SQL DB 上创建了一个函数来执行此操作。

CREATE OR ALTER FUNCTION [dbo].[UTIL_SplitList](@parList Varchar(MAX),@splitChar Varchar(1)=',') 
  Returns @t table (Column_Value varchar(MAX))
  as
  Begin
    Declare @pos integer 
    set @pos = CharIndex(@splitChar, @parList)
    while @pos > 0
    Begin
      Insert Into @t (Column_Value) VALUES (Left(@parList, @pos-1))
      set @parList = Right(@parList, Len(@parList) - @pos)
      set @pos = CharIndex(@splitChar, @parList)
    End
    Insert Into @t (Column_Value) VALUES (@parList)
    Return
  End

一旦函数存在,它就像

SELECT DISTINCT 
    *
FROM 
    [dbo].[UTIL_SplitList]('1,1,1,2,5,1,6',',') 
于 2020-12-02T19:24:25.433 回答
-2

对我有用的一种技术是查询一个您知道其中有大量记录的表,包括结果中的 Row_Number 字段

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

将返回从 1 到 10000 的 10000 条记录的结果集,在另一个查询中使用它来为您提供所需的结果

于 2013-01-08T16:21:12.277 回答
-5

使用 SQLIn函数

像这样的东西:

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

在 ArcGIS 中工作

于 2013-12-02T23:51:13.090 回答