SQL Server의 값 목록에서 선택하는 방법


217

해결할 수없는 매우 간단한 문제가 있습니다. 나는 이런 식으로해야합니다 :

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

누구든지 도울 수 있습니까 ??

편집하다

데이터는 클라이언트 중 하나에서 텍스트 파일로 제공됩니다. 형식이 완전히 지정되지 않았지만 (한 줄의 매우 긴 텍스트) Excel에서 그렇게 할 수 있습니다. 그러나 SQL 쿼리에서 이러한 값을 사용해야하기 때문에 실용적이지 않습니다. 쿼리를 실행할 때마다 그렇게하는 것이 편리하지 않습니다.


여러 테이블에서 선택하거나 단일 테이블에서 선택하지만 특정 값을 선택 하시겠습니까? 특정 아이디과 같은 몇 가지 점은 혼자
사진 제공 : Anirudh 고엘

당신이 묻는 것은 아니지만 다른 언어로 할 수 있습니다. 예를 들어 PowerShell에서는 $d = (1, 1, 1, 2, 5, 1, 6) | sort -Unique배열에서 고유 한 값을 가져 오도록 할 수 있습니다 $d. 파일 간 도구로 쉽게 확장 할 수 있습니다.
Jeppe Stig Nielsen

이러한 값의 고유 목록을 가져 오거나 해당 값 목록을 SQL로 가져 오는 것이 중요한가? @JeppeStigNielsen이 말했듯이 SQL과 관련이없는 텍스트 목록에서 다른 값을 얻는 다른 방법이 있습니다. 다른 테이블을 참조하는 SQL 스크립트에 값 목록을 가져 오는 방법을 찾고 왔습니다.
Rikki

답변:


81

쉼표로 구분 된 긴 텍스트 목록의 고유 한 값 을 얻는 가장 간단한 방법 은 UNION 으로 바꾸기를 사용 하여 고유 한 값을 얻는 것입니다.

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

쉼표로 구분 된 긴 텍스트 줄에 적용

  • 모든 쉼표를 찾아서 바꿉니다. UNION SELECT
  • SELECT명세서 앞에 추가

당신은 지금 작동 쿼리가 있어야합니다


3
아니요, 아니요, 수백 개의 값 목록이 있습니다. 수동으로 고문을 당합니다
Eedoh

그 목록은 어디에서 왔습니까? Excel에서 해당 목록을 복사 / 붙여 넣기하고 간단한 크로스 탭을 사용하여 고유 한 값을 추출하는 것이 더 쉬울 수 있습니다.
Lieven Keersmaekers

btw, 찾기 및 바꾸기도 먼 길을 걸을 수 있습니다. 모든 쉼표를 union select 로 바꾸고 앞에 select 를 추가하면 내가 표시 한 union에서 작동하는 쿼리가 있어야합니다.
Lieven Keersmaekers

1
선택 노조와 쉼표를 대체하는이 물건 :) 많은 감사의 매력처럼 작동
Eedoh

5
성능상의 이유로 Union-All을 선택한 다음 Group-By를 선택하거나 외부 선택에 Distinct를 사용하는 것이 좋습니다.
MikeTeeVee 2014 년

428

단지 SQL 서버 2008 이상 사용 가능하면이 형태의 행 생성자 :
당신은 사용할 수 있습니다

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

많은 사람들이 그들 가운데 다음과 같이 썼습니다.


66
참고 : X테이블 이름의 a별명이고 열 이름의 별명입니다.;).
shA.t

11
이것은 현재 선택된 답변과 비교하여 더 정확한 답변입니다
TabsNotSpaces

1
이것은 가장 일반적인 방법이며, unnest (ARRAY [])에 의해 망쳐졌고 pgsql이제는 FROM이에서 행 값으로 작은 값을 허용하도록 머리를 두드리고 sqlserver있습니다. 알고 행복합니다.
Ben

1
열 및 테이블 별칭으로 인한 더 나은 답변
Alfredo A.

79

일반적으로 :

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)

1
"select *"가 잘못된 형식으로 간주되지만이 경우 select *를 사용하지 않는 이유가 있습니까? FieldName1, FieldName2, ..., FieldNameN의 중복은 그로테스크합니다.
Pxtl

@Pxtl "Select *"를 사용하지 않아도됩니다. 그 필드의 이름을 더 명확하게 다시 작성했습니다. 또한 "고유 한"키워드가 필요하지 않을 수도 있습니다.
Ardalan Shahgholi는

43

다음 구문을 사용해 보셨습니까?

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

5
익명 사용자는 편집에 코드를 제안 :SELECT DISTINCT table_name.column_name FROM (VALUES (1), (2), (3)) AS table_name(column_name)
Vogel612

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

1
테이블에서 선택할 필요는 없지만이 값 목록에서 괄호로 묶을 수는 없습니다. 이것이 주요 문제입니다 (테이블이 아닌 쉼표로 구분 된 값 배열에서 선택)
Eedoh

이 경우 Oracle에 DUAL 테이블이있는 것처럼이를 사용할 수 있습니다. 그러나 DUAL이 없기 때문에 노조로 가야합니다. 쉼표로 구분 된 값 배열을 언급했듯이 다른 방법을 시도 할 수 있습니다. 테이블에 값을 삽입 한 다음 너무 많은 SQL 공용체를 사용하는 대신 깔끔한 SQL 선택 쿼리를 사용하지 마십시오.
Anirudh Goel

14

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)

11
문제는 MSSQL ... 지정 않지만:)
halfer

@halfer 여기에 주어진 첫 번째 답변은 MSSQL 2016을 사용하는 동안 나에게 도움이되었지만 다른 답변은 그렇지 않았습니다. 7 년 후
dustytrash

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)

2
+1 깔끔하지만 syscomments의 행 수 자체로 제한됩니다. 제 경우에는 294849까지입니다. (그리고 당신은 별개를 잊었습니다.)
Lieven Keersmaekers

한 번 더 교차 조인 할 수 있지만 쉼표를 바꾸는 것이 훨씬 빠른 솔루션입니다.
LukLed

예,이 방법도 좋지만 단순성 때문에 Lieven의 솔루션을 선호합니다.
Eedoh

3

나는 이것이 꽤 오래된 실이라는 것을 알고 있지만 비슷한 것을 찾고 있었고 이것을 생각해 냈습니다.

쉼표로 구분 된 문자열이 있다고 가정하면 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

MSSQL 2016 이상이 필요한 것 같습니다 : docs.microsoft.com/en-us/sql/t-sql/functions/…
Jonathan

1
@Sam 네, 원래 질문의 태그에 따른 SQL Server입니다.
NapkinBob

1
@Jonathan 네, 질문의 나이를 감안할 때, 원래 포스터는 도움이되지 않았지만 누군가가 그랬던 것처럼 우연히 발견되어 도움이 될 것이라고 생각했습니다.
NapkinBob

2

배열이 필요한 경우 배열 열을 쉼표로 구분하십시오.

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

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);

0

사용자 ID 목록에서 사용자 ID를 선택하십시오.

SELECT * FROM my_table WHERE user_id IN (1,3,5,7,9,4);

-2

나를 위해 일한 기술은 결과의 Row_Number 필드를 포함하여 많은 양의 레코드가있는 테이블을 쿼리하는 것입니다.

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

1에서 10000까지 10000 개의 레코드 결과 집합을 반환하고 다른 쿼리 내에서이를 사용하여 원하는 결과를 제공합니다.


-4

SQL In함수 사용

이 같은:

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

ArcGIS에서 간병인


1
이 SELECT는 SQL Server에서 구문 오류를 생성합니다.
JohnH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.