2013-08-30 3 views
6

मुझे पता है कि मैं like %termToFind% का उपयोग करके T-SQL में एक तालिका में एक स्तंभ में एक शब्द के लिए खोज सकते हैं। और मुझे पता है कि मैं इस के साथ एक तालिका के सभी कॉलम प्राप्त कर सकते हैं:मैं रिकॉर्ड्स का चयन कैसे करूं जो किसी तालिका में किसी भी कॉलम के लिए कुछ स्ट्रिंग की तरह हैं?

SELECT * 
FROM MyDataBaseName.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'MyTableName` 

कैसे मैं एक तालिका के कॉलम में से प्रत्येक पर एक तरह comprparison प्रदर्शन कर सकते हैं? मेरे पास एक बहुत बड़ी टेबल है इसलिए मैं प्रत्येक कॉलम के लिए LIKE को स्पेल नहीं कर सकता।

+3

आपको लगता है कि आप भविष्य में एक बहुत इस तरह काम करने जा सकता है, तो आप SQL सर्वर के पूर्ण पाठ खोज सुविधा पर ध्यान देना चाहिए। @ रोमनपेकर का एक्सएमएल दृष्टिकोण काम करेगा, लेकिन यह वास्तव में इंडेक्स का उपयोग नहीं कर सकता है, इसलिए तेज़ नहीं होगा। यह ठीक है अगर आप केवल थोड़ी देर में ऐसा करते हैं, लेकिन यदि आपको ऑनलाइन उपयोगकर्ता प्रश्नों के लिए इसकी आवश्यकता है, तो आपका सर्वर बहुत तेज़ी से गिर जाएगा। शांत जवाब - – RBarryYoung

+0

बिल्कुल सच –

उत्तर

10

हमेशा की तरह, मैं इस के लिए एक्सएमएल (मैं JSON सुझाव देंगे अगर एसक्यूएल सर्वर इसके लिए देशी समर्थन किया था :)) का सुझाव देंगे। हालांकि यह पंक्तियों की बड़ी संख्या पर नहीं इतनी अच्छी तरह से प्रदर्शन कर सकता है आप इस क्वेरी का उपयोग करने की कोशिश कर सकते हैं:

;with cte as (
    select 
     *, 
     (select t.* for xml raw('data'), type) as data 
    from test as t 
) 
select * 
from cte 
where data.exist('data/@*[local-name() != "id" and contains(., sql:variable("@search"))]') = 1 

अधिक विस्तृत उदाहरण के लिए sql fiddle demo देखते हैं।

महत्वपूर्ण टिप्पणी Alexander Fedorenko टिप्पणी में से: यह समझा जाना चाहिए contains समारोह केस-संवेदी है और स्ट्रिंग तुलना के लिए XQuery डिफ़ॉल्ट यूनिकोड कोड बिंदु मिलान का उपयोग करता है।

अधिक सामान्य तरीके से गतिशील एसक्यूएल समाधान का उपयोग करने होगा:

declare @search nvarchar(max) 
declare @stmt nvarchar(max) 

select @stmt = isnull(@stmt + ' or ', '') + quotename(name) + ' like @search' 
from sys.columns as c 
where c.[object_id] = object_id('dbo.test') 
-- 
-- also possible 
-- 
-- select @stmt = isnull(@stmt + ' or ', '') + quotename(column_name) + ' like @search' 
-- from INFORMATION_SCHEMA.COLUMNS 
-- where TABLE_NAME = 'test' 

select @stmt = 'select * from test where ' + @stmt 

exec sp_executesql 
    @stmt = @stmt, 
    @params = N'@search nvarchar(max)', 
    @search = @search 

sql fiddle demo

+1

+1 @RBarryYoung। – Devart

+0

@Devart धन्यवाद, गतिशील एसक्यूएल समाधान –

+0

IMHO कहा: 'sys.columns' छिपा' INFORMATION_SCHEMA.COLUMNS' के साथ तुलना में जुड़ जाता है शामिल नहीं है: 'चयन c.name से sys.columns ग कहां object_id ('dbo.test') = सी। [object_id] ' – Devart

1

मैं यहाँ गतिशील एसक्यूएल का उपयोग करेंगे।

पूर्ण क्रेडिट - यह उत्तर आरंभ में किसी अन्य उपयोगकर्ता द्वारा पोस्ट किया गया था, और हटा दिया गया था। मुझे लगता है कि यह एक अच्छा जवाब है इसलिए मैं इसे फिर से जोड़ रहा हूं।

DECLARE @sql NVARCHAR(MAX); 
DECLARE @table NVARCHAR(50); 
DECLARE @term NVARCHAR(50); 

SET @term = '%term to find%'; 
SET @table = 'TableName'; 
SET @sql = 'SELECT * FROM ' + @table + ' WHERE ' 

SELECT @sql = @sql + COALESCE('CAST('+ column_name 
    + ' as NVARCHAR(MAX)) like N''' + @term + ''' OR ', '') 
FROM INFORMATION_SCHEMA.COLUMNS WHERE [TABLE_NAME] = @table 

SET @sql = @sql + ' 1 = 0' 
SELECT @sql 
EXEC sp_executesql @sql 

एक्सएमएल जवाब क्लीनर है (मैं गतिशील एसक्यूएल पसंद करते हैं केवल जब आवश्यक है), लेकिन इस बात का लाभ यह है कि यह किसी भी सूचकांक आप अपनी मेज पर है का उपयोग करेंगे है, और वहाँ के लिए एक्सएमएल CTE के निर्माण में कोई भूमि के ऊपर है क्वेरी।

+0

यह एसक्यूएल इंजेक्शन का विषय हो सकता है - यही कारण है कि मैंने पैरामीटर के साथ sp_executesql का उपयोग किया है –

0

मामले में किसी PostgreSQL समाधान की तलाश में है:

SELECT * FROM table_name WHERE position('your_value' IN (table_name.*)::text)>0 

सभी रिकॉर्ड किसी भी कॉलम में 'your_value' है का चयन करेंगे। किसी अन्य डेटाबेस के साथ यह कोशिश नहीं की।

दुर्भाग्य से यह एक पाठ स्ट्रिंग के सभी स्तंभों के संयोजन के रूप में काम करता है और फिर उस स्ट्रिंग में एक मूल्य के लिए खोज करता है, तो मैं यह केवल "पूरे सेल" से मिलान करने के लिए एक तरह से पता नहीं है। यदि किसी भी सेल का कोई भी हिस्सा 'your_value' से मेल खाता है तो यह हमेशा मेल खाता होगा।

संबंधित मुद्दे