私は解決できない非常に単純な問題を抱えています。私はこのようなことをする必要があります:
select distinct * from (1, 1, 1, 2, 5, 1, 6).
誰でも手伝える?
編集
データは私達の顧客の1人からのテキストファイルとして来る。それは全くフォーマットされていません(それは1つの非常に長いテキスト行です)が、Excelでそうすることは可能かもしれません。私は私のSQLクエリでこれらの値を使用する必要があるので、しかし、それは私にとって実用的ではありません。クエリを実行する必要があるたびにそうするのは便利ではありません。
カンマ区切りテキストの長いリストの個別の値を取得する最も簡単な方法は、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
を追加しますこれで作業中のクエリがあるはずです
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])
これはかなり古いスレッドですが、私は似たようなものを探していてこれを思いついたのです。
カンマ区切りの文字列があるとすれば、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
あなたが使うことができるもう一つの方法はこのような問い合わせです:
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);