SQL Serverの値のリストから選択するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/1564956

  •  21-09-2019
  •  | 
  •  

質問

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

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

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

編集

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

役に立ちましたか?

解決

取得する最も簡単な方法 コンマの区切りテキストの長いリストの明確な値 交換を検索することです 連合 個別の値を取得します。

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

コンマの区切りテキストの長いラインに適用されます

  • すべてのコンマを見つけて交換します UNION SELECT
  • Aを追加します SELECT 声明の前で

これで、動作中のクエリが必要です

他のヒント

SQL Server 2008以上でのみ利用可能です。
使用できます

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

多くの人が書いた、その中に:

一般に :

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 * from (values (1), (2), (3), (4), (5)) numbers(number)

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

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

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)

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

配列が必要な場合は、配列列をコンマで分離します。

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

使用できるもう1つの方法は、次のようなクエリです。

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

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

コンマ区切りの文字列があったことを考えると、使用できます string_split

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

これは返されるはずです

1
2
5
6

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

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

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

生成

2
5
6

私のために働いたテクニックは、結果にrow_numberフィールドだけを含む、あなたが知っているテーブルに大量のレコードがあることを照会することです

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

1〜10000の10000レコードの結果セットを返します。これを別のクエリ内で使用して、目的の結果を提供します

SQLを使用します In 関数

このようなもの:

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

Arcgisでおやつを作る

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top