web-dev-qa-db-ja.com

SQL Serverの値の一覧から選択する方法

私は解決できない非常に単純な問題を抱えています。私はこのようなことをする必要があります:

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

誰でも手伝える?

編集

データは私達の顧客の1人からのテキストファイルとして来る。それは全くフォーマットされていません(それは1つの非常に長いテキスト行です)が、Excelでそうすることは可能かもしれません。私は私のSQLクエリでこれらの値を使用する必要があるので、しかし、それは私にとって実用的ではありません。クエリを実行する必要があるたびにそうするのは便利ではありません。

176
Eedoh

カンマ区切りテキストの長いリストの個別の値を取得する最も簡単な方法は、findを置換して UNION を使用して個別の値を取得することです。値.

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

長い行のコンマ区切りテキストに適用される

  • すべてのコンマを見つけてUNION SELECTに置き換えます。
  • ステートメントの前にSELECTを追加します

これで作業中のクエリがあるはずです

71

SQL Server 2008以降でのみ使用可能で、次の形式の行コンストラクタがあります。
あなたは使うことができます

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

多くの人がその中に書いています:

363
pm.

一般に :

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

次の構文を使ってみましたか?

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

単一のテーブルから特定の値のみを選択したい場合は、これを試すことができます。

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
19
Anirudh Goel

PostgreSQLには、これを行う2つの方法があります。

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
Arek

これは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)
9
LukLed

配列が必要な場合は、配列の列をカンマで区切ります。

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

これはかなり古いスレッドですが、私は似たようなものを探していてこれを思いついたのです。

カンマ区切りの文字列があるとすれば、string_splitを使用できます。

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

これは戻ります

1
2
5
6

文字列分割は、文字列入力と区切り文字の2つのパラメータを取ります。

列名としてvalueを使用して、オプションのwhereステートメントを追加できます。

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

作り出す

2
5
6
0
NapkinBob

あなたが使うことができるもう一つの方法はこのような問い合わせです:

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
shA.t