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


216

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

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

誰でも助けることができますか?

編集する

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


複数のテーブルから選択しますか、それとも単一のテーブルから選択しますが、特定の値を選択しますか?特定のIDだけのようなもの
Anirudh Goel

あなたが尋ねるものではありませんが、別の言語でそれを行うことができます。たとえばPowerShellでは$d = (1, 1, 1, 2, 5, 1, 6) | sort -Unique、配列内の個別の値を取得することができます$d。ファイルツーファイルツールに拡張するのは簡単です。
Jeppe Stig Nielsen 2017

これらの値の明確なリストを取得するため、またはその値のリストをSQLに取得するためにここで重要なことはありますか?@JeppeStigNielsenが言うように、SQLを使用せずにテキストリストから個別の値を取得する方法は他にもあります。他のテーブルを参照するSQLスクリプトに値のリストを取得する方法を探してここに来ました。
Rikki

回答:


81

コンマで区切られたテキストの長いリストの個別の値を取得する最も簡単な方法は、一意のを取得するためにUNIONで find a replaceを使用することです。

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、2009年

ところで、検索と置換も長い道のりになるかもしれません。すべてのコンマをunion selectで置き換え、selectを前に追加すると、私が示したunionから機能するクエリが作成されます。
Lieven Keersmaekers、2009年

1
これは、コンマを選択ユニオンで置き換えたもので、魅力のように機能します。ありがとうございました:)
Eedoh

5
パフォーマンス上の理由から、Union-All、次にGroup-Byをお勧めするか、外部選択でDistinctを使用します。
MikeTeeVee 2014年

427

SQL Server 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。知ってうれしい。
ベン

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)

「select *」は不適切な形式と見なされていますが、この場合にselect *を使用しない理由はありますか?FieldName1、FieldName2、...、FieldNameNの重複はグロテスクだからです。
Pxtl

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はこれを行う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
質問ではMSSQLが指定されていますが:)
2012

@halferここで与えられた最初の回答は私にとってMSSQL 2016を使用して機能しましたが、他の回答は機能しませんでした。7年後
ほこりの多いゴミ

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、2009年

3

私はこれがかなり古いスレッドであることを知っていますが、私は同じようなものを探していて、これを思いつきました。

カンマ区切りの文字列があるとすると、 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

これは、MSSQL 2016以降が必要のようです:docs.microsoft.com/en-us/sql/t-sql/functions/...
ジョナサン・

1
@Samはい、これは元の質問のタグによるSQL Serverです
NapkinBob

1
@ジョナサンはい、質問の年齢を考えると、元のポスターには役立たなかっただろうが、私がそうであるように誰かがそれにつまずいたかもしれないと思って、それが役に立ったと思った。
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.