2017-06-30 10 views
5

मैं इस तरह कॉलम युक्त तालिका है: abc qwe ax xyza :एसक्यूएल का चयन करें जहां स्तंभ सभी सीमांकित तार है

Table: teeburu Columns: - aidi int identity - bariu varchar(8000)

मैं उदाहरण के लिए, एक संग्रहीत प्रक्रिया है जो अपने इनपुट एक स्ट्रिंग है करना चाहते हैं उपयोगकर्ता के इनपुट के लिए लंबाई और कितनी रिक्त स्थान मुक्त हैं।

तथा उसके द्वारा सभी पंक्तियों जो स्तंभ bariuइन सभी की शामिल चयन करने के लिए है: abc, qwe, ax, और xyza

यहाँ मैं क्या करने की कोशिश की है:

मैं विभाजन समारोह बनाने (this page से कॉपी)

create FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1)) 
returns @temptable 
TABLE (nameIndex int identity(1,1),items varchar(8000)) 
as 
begin 
    declare @idx int 
    declare 
    @slice varchar(8000) 

    select @idx = 1 
    if len(@String)<1 or @String 
    is null return 

    while @idx!= 0 
    begin 
    set @idx = 
    charindex(@Delimiter,@String) 
    if @idx!=0 
    set @slice = left(@String,@idx 
    - 1) 
    else 
    set @slice = @String 

    if(len(@slice)>0) 
    insert 
    into @temptable(Items) values(@slice) 

    set @String = 
    right(@String,len(@String) - @idx) 
    if len(@String) = 0 break 
    end 

return 
end 

इसके साथ में, मैं प्रबंधित सभी पंक्तियों जो स्तंभ bariuकम से कम एक इनमें से होता है का चयन करने के कुछ लिखें: abc, qwe, ax, और xyza

with list as(
    select * from dbo.split(@Param,' ') 
) 
SELECT aidi, bariu FROM teeburu 
    INNER JOIN list 
    ON bariu like '%'+ list.items+ '%' 
    GROUP BY aidi, bariu 

लेकिन मैं कैसे करना है को समझ नहीं सकता सभी के बजाय में से कम से कम एक। मेरा सवाल यह है कि यह कैसे करें?

मैं एमएस एसक्यूएल सर्वर का उपयोग कर रहा

उत्तर

5

आप केवल जोड़ने HAVING COUNT(*) = (SELECT COUNT(*) FROM list)

with list as(
    select * from dbo.split('abc qwe ax xyza',' ') 
) 
SELECT aidi, bariu FROM teeburu 
    INNER JOIN list 
    ON bariu like '%'+ list.items+ '%'  
    GROUP BY aidi, bariu 
    HAVING COUNT(*) = (SELECT COUNT(*) FROM list) 
0

मैं भी पैरामीटर की गिनती लाने के लिए विभाजन समारोह को संशोधित करेगा।

ऐसा करने से यह नहीं बढ़ेगा मेरे कार्य में वृद्धि नहीं होगी और न ही कोई छिड़काव प्रभावित होगा।

TABLE (nameIndex int identity(1,1),items varchar(8000),ParamCount int) 

तो आप पहले से ही पाशन कर रहे हैं ताकि एक चर लेने के लिए और चर यहां के प्रत्येक पाश डालने मूल्य पर इसके मूल्य में वृद्धि,

insert into @temptable(Items,ParamCount) values(@slice,@Newvar) 

लाभ: यदि आप एक गिनती (*) बयान से बचने होगा।

SELECT COUNT(*) FROM list 

तो अंतिम क्वेरी,

SELECT aidi 
    ,bariu 
FROM teeburu 
CROSS APPLY (
    SELECT Items 
     ,paramcount 
    FROM dbo.split('abc qwe ax xyza', ' ') 
    ) list 
WHERE bariu LIKE '%' + list.items + '%' 
GROUP BY aidi 
    ,bariu 
HAVING COUNT(*) = list.paramcount 

इसके अलावा यह अपने वास्तविक क्वेरी पर निर्भर करते हैं और हो सकता है table.May आपको चाहिए उपयोग इतने सारे स्तंभ

द्वारा समूह के बजाय ROW_NUMBER
संबंधित मुद्दे