Sql server 根据是否已设置参数查找行值
我有一个存储过程,它有两个参数:@Name和@姓氏,必须由外部源设置 我需要存储过程根据设置的参数返回值。它应该忽略空参数,只考虑设置参数Sql server 根据是否已设置参数查找行值,sql-server,parameters,Sql Server,Parameters,我有一个存储过程,它有两个参数:@Name和@姓氏,必须由外部源设置 我需要存储过程根据设置的参数返回值。它应该忽略空参数,只考虑设置参数 SELECT * FROM ParticipantNames WHERE -- The if below should go here... if(@Name iS NOT NULL) - find the row whose [NAME] column LIKE @Name else skip name comparison. if(@Surnam
SELECT *
FROM ParticipantNames
WHERE -- The if below should go here...
if(@Name iS NOT NULL) - find the row whose [NAME] column LIKE @Name else skip name comparison.
if(@Surname iS NOT NULL) - find the row whose [SURNAME] column LIKE @Surname else skip surname comparison.
if(@Name AND @Surname is NOT NULL) - find the row whose [NAME] column LIKE @Name AND whose [SURNAME] column LIKE @Surname
如果已设置所有参数,但未设置一个参数时返回0行,则以下操作有效
;WITH tempSearch AS
(
SELECT *
FROM ParticipantNames f
WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN NULL ELSE @Name END)
AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN NULL ELSE @Surname END)
...
我知道由于AND子句,它返回0行,但我不知道如何修复它
关于如何实现这一点,您有什么建议吗?您似乎试图在查询中使用“默认”模式 这里的问题是在WHEN的情况下投影NULL,这将导致WHERE列,比如NULL,这将不起作用 您可以做的是重新替换实际列,如下所示:
SELECT *
FROM ParticipantNames f
WHERE ((f.Name LIKE CASE WHEN @Name IS NULL THEN Name ELSE @Name END)
AND (f.Surname LIKE CASE WHEN @Surname IS NULL THEN Surname ELSE @Surname END)
这将导致在默认情况下出现类似列的列,这将起作用
但是请注意,由于谓词的条件使用,这样的查询在查询优化器上很难实现。关于如何最好地处理“可选参数”的应用,有很多建议。f.Name喜欢什么isnull@Name,“%”和f。类似姓氏isnull@Surname“%”很有魅力!如果您使用的是更高级的语言来进行查询,那么最好首先消除“不需要的”WHERE谓词,而不是使用像这样的hack或ISNULL