Как выбрать из списка значений в SQL Server

У меня очень простая проблема, которую я не могу решить. Мне нужно сделать что-то вроде этого:

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

Кто-нибудь может помочь?

Изменить

Данные поступают в виде текстового файла от одного из наших клиентов. Он полностью неформатирован (это одна, очень длинная строка текста), но в Excel это возможно. Но это не практично для меня, потому что мне нужно будет использовать эти значения в моем sql-запросе. Это не удобно делать каждый раз, когда мне нужно запускать запрос.

Ответ 1

Самый простой способ получить различные значения длинного списка текста с разделителями-запятыми будет заключаться в том, чтобы найти замену с помощью UNION, чтобы получить различные значения.

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

Применяется к вашей длинной строке текста с разделителями-запятыми

  • Найти и заменить каждую запятую UNION SELECT
  • Добавьте SELECT перед оператором

Теперь у вас должен быть рабочий запрос

Ответ 2

Доступно только для SQL Server 2008 и более - конструктор строк в этой форме:
Вы можете использовать

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

Многие писали о них, среди них:

Ответ 3

Вы пробовали использовать следующий синтаксис?

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

Ответ 4

В целом:

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)

Ответ 5

Если вы хотите выбрать только определенные значения из одной таблицы, вы можете попробовать это

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

Ответ 6

PostgreSQL дает вам два способа сделать это:

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)

Ответ 7

Это работает на 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)

Ответ 8

Если вам нужен массив, разделите столбцы массива запятой:

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

Ответ 9

Другим способом, который вы можете использовать, является такой запрос:

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

Ответ 10

Метод, который работал у меня, - это запросить таблицу, в которой вы знаете, содержит большое количество записей, включая только поле Row_Number в вашем результате

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

вернет результирующий набор из 10000 записей от 1 до 10000, используйте это в другом запросе, чтобы дать вам желаемые результаты

Ответ 11

Используйте функцию SQL In

Что-то вроде этого:

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

Выполняет обработку в ArcGIS