270

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

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

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

編集

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

4

16 に答える 16

530

SQL Server 2008 以降でのみ使用できるのは、次の形式の行コンストラクター
です。

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

詳細については、次を参照してください。

于 2011-09-02T14:39:51.827 に答える
100

カンマ区切りのテキストの長いリストの個別の値を取得する最も簡単な方法は、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ステートメントの前にを追加します

これで、クエリが機能するはずです

于 2009-10-14T08:24:07.713 に答える
44

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

select * from (values (1), (2), (3), (4), (5)) numbers(number)
于 2014-12-12T11:45:59.553 に答える
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
于 2009-10-14T08:26:02.550 に答える
19

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)
于 2012-08-01T20:00:12.173 に答える
9

これはSQLServer2005で機能し、最大数がある場合は次のようになります。

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)
于 2009-10-14T08:36:01.840 に答える
0

これを行うために、私が取り組んでいるほとんどの SQL DB で関数を作成します。

CREATE OR ALTER FUNCTION [dbo].[UTIL_SplitList](@parList Varchar(MAX),@splitChar Varchar(1)=',') 
  Returns @t table (Column_Value varchar(MAX))
  as
  Begin
    Declare @pos integer 
    set @pos = CharIndex(@splitChar, @parList)
    while @pos > 0
    Begin
      Insert Into @t (Column_Value) VALUES (Left(@parList, @pos-1))
      set @parList = Right(@parList, Len(@parList) - @pos)
      set @pos = CharIndex(@splitChar, @parList)
    End
    Insert Into @t (Column_Value) VALUES (@parList)
    Return
  End

関数が存在すると、次のように簡単です

SELECT DISTINCT 
    *
FROM 
    [dbo].[UTIL_SplitList]('1,1,1,2,5,1,6',',') 
于 2020-12-02T19:24:25.433 に答える
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);
于 2015-12-26T07:34:07.617 に答える
-2

私にとってうまくいった手法は、結果の Row_Number フィールドだけを含め、大量のレコードが含まれていることがわかっているテーブルをクエリすることです

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

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

于 2013-01-08T16:21:12.277 に答える