2016-11-28 86 views
0

说我有一个表,音乐:凡与和凝聚

Genre   Artist    Song 
Rock   Rolling Stones  Brown Sugar 
Rock   Bob Seger   Night Moves 
Country  Eric Church   Record Year 
Pop   Bruno Mars   Grenade 

而且我有

DECLARE @Genre VarChar(MAX) = NULL 
DECLARE @Artist VarChar(MAX) = NULL 

SELECT * 
FROM Music M 
WHERE (M.Genre = COALESCE(@Genre, M.Genre) OR 
M.Artist = COALESCE(@Artist, M.Artist)) 

这让我选择一个流派,并添加一个随机的艺术家的选择,我也想看看。

但是,如果我想在多个艺术家作为一个字符串传递,什么 即

@Genre = Rock 
@Artist = 'Eric Church, Bruno Mars' 

凡在本质上我需要的报表,但还必须处理情况,其中变量为空?

我正在使用SQL SERVER。

如果需要感谢您

+3

考虑使用一个字符串分割功能,例如:https://sqlperformance.com/2012/07/t-sql-queries/split-strings – ZLK

+0

你想'AND'而不是'OR'。否则,将NULL传递到任一字段将返回所有行。 –

回答

1
  1. 您可以使用CHARINDEX,但性能不高。

    SELECT * 
    FROM Music M 
    WHERE CHARINDEX(','+M.Genre+',',','[email protected]+',') >0 OR CHARINDEX(','+M.Artist+',',','[email protected]+',') >0 
    
  2. 动态声明:

    DECLARE @Genre VarChar(MAX) = NULL 
    DECLARE @Artist VarChar(MAX) = NULL 
    DECLARE @sql NVARCHAR(max) 
    SET @sql=' 
         SELECT * 
         FROM Music M 
         WHERE M.Genre in ('[email protected]+') OR M.Artist in ('[email protected]+')' 
    EXEC(@sql) 
    
  3. 采用分体式字符串函数

  4. 处理NULL,你可以改变语句。

    SET @sql=' 
         SELECT * 
         FROM Music M 
         WHERE M.Genre in ('+ISNULL(@Genre,'M.Genre')+') OR M.Artist in ('+ISNULL(@Artist,'M.Artist')+')' 
    

当@Genre和@Artist为null,该脚本将低于:

SELECT * FROM Music M 
WHERE M.Genre in (M.Genre) OR M.Artist in (M.Artist)' 

1(1)永远是真实的

+0

hi Nolan,会使用动态语句处理空情况吗?你看我用coalesce返回所有如果没有通过 – user3697498

+0

4号对你有帮助吗? –

+0

是的,那太棒了。非常感谢你 – user3697498

1

使用解析/分割功能

Declare @Artist varchar(max) = 'Eric Church,Bruno Mars' 
Declare @Genre varchar(max) = 'Rock' 

Select Distinct A.* 
    From YourTable A 
    Join (
     Select * from [dbo].[udf-Str-Parse](@Artist,',') 
     Union All 
     Select * from [dbo].[udf-Str-Parse](@Genre,',') 
     ) B on A.Artist = B.RetVal or A.Genre=B.RetVal 

返回

Genre  Artist   Song 
Country  Eric Church  Record Year 
Pop   Bruno Mars  Grenade 
Rock  Bob Seger  Night Moves 
Rock  Rolling Stones Brown Sugar 

的UDF

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')