C# 存储过程更改where子句语句

C# 存储过程更改where子句语句,c#,sql,sql-server,C#,Sql,Sql Server,我有一个关于sql语句的问题。可以用这种方式进行查询吗?我需要筛选一个where子句,该子句取决于@user\u id的值 ALTER PROCEDURE [dbo].[getUserAddress] @user_id int = null AS SELECT user_id, state_code, address from UserAddress IF(@user_id > 10) BEGIN WHERE state_code = 'CA' END ELSE WHERE

我有一个关于sql语句的问题。可以用这种方式进行查询吗?我需要筛选一个where子句,该子句取决于@user\u id的值

ALTER PROCEDURE [dbo].[getUserAddress]
  @user_id int = null
AS

SELECT user_id, state_code, address from UserAddress

IF(@user_id > 10)
BEGIN
 WHERE state_code = 'CA'
END
ELSE
  WHERE address = 'HILLS'
END
我试图这样做,但这似乎不是一个标准的方式

IF(@user_id > 10)
BEGIN
 SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA'
END
ELSE
   SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS'
END
请告知此概念的最佳方法。请帮忙。
谢谢

您在您的
else
之后缺少一个
开始
。试试这个:

IF(@user_id > 10)
BEGIN
 SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA'
END
ELSE
BEGIN
   SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS'
END
您可以简化:

select 
    user_id, 
    state_code, 
    address 
from 
    UserAddress 
where 
    (@user_id > 10 and state_code = 'CA') or
    (@user_id IS NULL OR (@user_id <= 10 and address = 'HILLS'))
选择
用户id,
州代码,
地址
从…起
用户地址
哪里
(@user_id>10,状态代码='CA')或

(@user\u id为NULL或(@user\u id而不是在where语句中使用此用例):

   SELECT user_id, state_code, address from UserAddress WHERE 
   (case when @user_id > 10 then state_code  else address end) 
   = (case when @user_id > 10 then 'CA' else 'HILLS' end)

还可以在存储过程中使用动态sql查询

查询

declare @sql as varchar(max);
select @sql = 'select * from [UserAddress] ' 
    + stuff((select case when @user_d > 10 
         then 'where state_code= ''CA''' 
         else 'where address = ''Hills''' end  
    for xml path('')), 1,0,'')

 exec(@sql);
试试这个

SELECT user_id, state_code, address from UserAddress
WHERE 
((WHERE state_code = 'CA') AND (@user_id > 10))
OR
((WHERE address = 'HILLS') AND (@user_id <= 10))
从UserAddress中选择用户id、状态代码、地址
哪里
((其中state_code='CA')和(@user_id>10))
或
((其中地址='HILLS')和(@user_id您可以简单地

WHERE
    (@user_id > 10 AND state_code = 'CA')
    OR ((@user_id <= 10 OR @user_id IS NULL) AND address = 'HILLS')
您可以尝试以下方法:

更改过程[dbo].[getUserAddress]
@用户id int=null
作为
开始

声明@sql nvarchar(5000)
set@sql='SELECT user\u id、state\u code、UserAddress'中的地址
如果(@user_id>10)
开始
设置@sql=@sql+,其中state_code=''CA'
结束
否则
设置@sql=@sql+,其中地址为“HILLS”
结束

Exec(@sql)

结束

您使用的是MySQL还是MS SQL Server?(不要标记未涉及的产品。)如果您使用的是MySQL,也就是@jarlh所说的您需要指定的,请选择您应该遵循的顺序在哪里!只有两个条件吗?您认为将来需要添加更多条件吗?是的,我可能会在将来添加可能的条件这是错误的!如果
(地址='HILLS')
是真的对
@user\u id
的检查被忽略了这仍然不等于OP所要求的(因为是空的),但已经足够接近了。逆转我的否决票。我想我的大脑一定被炸了。感谢你们两位指出了逻辑缺陷(已经修复)。我喜欢这种方式,非常聪明的恭维。
IF @user_id > 10
   SELECT user_id, state_code, address from UserAddress WHERE state_code = 'CA'
ELSE
   SELECT user_id, state_code, address from UserAddress WHERE address = 'HILLS'