如何从SQL Server中的值列表中进行选择

Eed*_*doh 194 sql-server select-query

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

select distinct * from (1, 1, 1, 2, 5, 1, 6).
Run Code Online (Sandbox Code Playgroud)

有谁可以帮忙?

编辑

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

小智 387

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

SELECT DISTINCT * FROM (VALUES (1), (1), (1), (2), (5), (1), (6)) AS X(a)
Run Code Online (Sandbox Code Playgroud)

许多人写到,其中包括:

  • 附注:`X`是表名的别名,`a`是列名的别名;). (57认同)
  • 与当前选择的答案相比,这是更正确的答案 (8认同)
  • 由于列和表别名,答案更好 (2认同)

Lie*_*ers 76

获取逗号分隔文本的长列表不同值的最简单方法是使用查找替换为UNION来获取不同的值.

SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
UNION SELECT 1
UNION SELECT 6
Run Code Online (Sandbox Code Playgroud)

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

  • 查找并替换每个逗号 UNION SELECT
  • SELECT在声明前添加一个

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

  • 出于性能原因,我建议使用Union-All,然后使用Group-By或在外部选择中使用Distinct. (5认同)
  • 不,不,我有几百个值的列表,手动它会折磨 (3认同)
  • 用 select union 替换逗号的这个东西就像一个魅力,非常感谢:) (2认同)

Ard*_*oli 64

一般来说 :

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 )
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

Select 
  distinct
  TempTableName.Field1 
From 
  (
  VALUES
    (1), 
    (1), 
    (1), 
    (2), 
    (5), 
    (1), 
    (6)
  ) AS TempTableName (Field1)
Run Code Online (Sandbox Code Playgroud)


Rob*_*bba 41

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

select * from (values (1), (2), (3), (4), (5)) numbers(number)
Run Code Online (Sandbox Code Playgroud)

  • 一位匿名用户建议将代码编辑为:`SELECT DISTINCT table_name.column_name FROM(VALUES(1),(2),(3))AS table_name(column_name)` (5认同)

Ani*_*oel 18

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

select distinct(*) from table_name where table_field in (1,1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

例如:

select first_name,phone_number from telephone_list where district id in (1,2,5,7,8,9)
Run Code Online (Sandbox Code Playgroud)

如果你想从多个表中选择那么你必须去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
Run Code Online (Sandbox Code Playgroud)


小智 14

PostgreSQL为您提供了两种方法:

SELECT DISTINCT * FROM (VALUES('a'),('b'),('a'),('v')) AS tbl(col1)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT DISTINCT * FROM (select unnest(array['a','b', 'a','v'])) AS tbl(col1)
Run Code Online (Sandbox Code Playgroud)

使用数组方法你也可以这样做:

SELECT DISTINCT * FROM (select unnest(string_to_array('a;b;c;d;e;f;a;b;d', ';'))) AS tbl(col1)
Run Code Online (Sandbox Code Playgroud)

  • 虽然问题确实指定了MSSQL ...`:)` (11认同)

Luk*_*Led 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)
Run Code Online (Sandbox Code Playgroud)

  • +1整洁,但它仅限于与自身交叉连接的syscomments中的行数.在我的情况下294849.(你忘了清楚.) (2认同)

小智 6

使用GROUP BY给你带来比以下更好的性能DISTINCT

SELECT *
FROM
(
    VALUES
        (1),
        (1),
        (1),
        (2),
        (5),
        (1),
        (6)
) AS A (nums)
GROUP BY A.nums;
Run Code Online (Sandbox Code Playgroud)


Nap*_*Bob 5

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

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

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
Run Code Online (Sandbox Code Playgroud)

这应该返回

1
2
5
6
Run Code Online (Sandbox Code Playgroud)

String split 接受两个参数,字符串输入和分隔符。

您可以添加一个可选的 where 语句value用作列名

select distinct value from string_split('1, 1, 1, 2, 5, 1, 6',',')
where value > 1
Run Code Online (Sandbox Code Playgroud)

产生

2
5
6
Run Code Online (Sandbox Code Playgroud)

  • @Jonathan 是的,考虑到问题的年龄,它对原始海报没有帮助,但我认为有人可能会像我一样偶然发现它,并发现它很有帮助。 (2认同)