كيف يمكنني الاختيار من قائمة القيم في SQL Server

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

  •  21-09-2019
  •  | 
  •  

سؤال

لدي مشكلة بسيطة للغاية لا يمكنني حلها. أحتاج إلى فعل شيء مثل هذا:

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

أي شخص يمكن أن يساعد ؟؟

يحرر

تأتي البيانات كملف نصي من أحد عملائنا. إنه غير مهتم تمامًا (إنه خط واحد طويل جدًا من النص) ، ولكن قد يكون من الممكن القيام بذلك في Excel. لكن هذا ليس عمليًا بالنسبة لي ، لأنني سأحتاج إلى استخدام هذه القيم في استعلام SQL الخاص بي. ليس من المناسب القيام بذلك في كل مرة أحتاج إلى تشغيل استعلام.

هل كانت مفيدة؟

المحلول

أبسط طريقة للحصول على قيم مميزة لقائمة طويلة من النصوص المحددة سيكون لاستخدام العثور على استبدال مع اتحاد للحصول على القيم المتميزة.

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 أو Over هو Bonstructor في هذا النموذج:
يمكنك استخدام

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 طريقتان للقيام بذلك:

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

هناك طريقة أخرى يمكنك استخدامها وهي استعلام مثل هذا:

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

يأخذ STRING SPLIT معلمتين ، إدخال السلسلة ، وحرف الفاصل.

يمكنك إضافة عبارة اختيارية حيث تستخدم عبارة 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

سيعود مجموعة نتائج من 10000 سجل من 1 إلى 10000 ، استخدم هذا ضمن استعلام آخر لإعطائك النتائج المطلوبة

استخدم SQL In وظيفة

شيء من هذا القبيل:

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

يعمل علاجًا في Arcgis

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top