Как выбрать из списка значений в 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