如何解决需要有条件的 Where 子句帮助 - SQL Server
大家早上好,希望你能帮我解决我正在处理的问题。我不认为这将是一个有条件的 where 子句,但感觉就像这样。
我有一个保存屏幕默认值的表格。该行可能是特定于州的,也可能适用于所有州。当行不是特定于状态时,stte_name 列加载了默认值“XX”。
查询此表时,我将提供以下条件:
- @screen_name
- @ctl_name
- @stte_name
我想检索满足所有三个条件的行以及满足@screen_name 和@ctl_name 条件的行,并且当状态不匹配时,stte_name 等于列默认值“XX”。
如果我设置@stte_name = 'NY',我的结果应该是这样的:
screen_name ctl_name stte_name dflt_value
Screen 1 control 1 NY Hello
Screen 1 control 2 XX World
Screen 1 control 3 XX !
如果我设置@stte_name = 'FL',我的结果应该是这样的:
screen_name ctl_name stte_name dflt_value
Screen 1 control 1 NY Bonjour
Screen 1 control 2 XX World
Screen 1 control 3 XX !
我已经在这方面工作了一段时间,但无法操纵状态标准来产生所需的结果。我尝试过子查询、全外连接和许多其他角度。
任何帮助将不胜感激。
CREATE TABLE dbo.defaults_t
(
screen_name VARCHAR(10),ctl_name VARCHAR(10),stte_name CHAR(2),dflt_value VARCHAR(10),CONSTRAINT PK_defaults_t PRIMARY Key CLUSTERED
(
screen_name ASC,ctl_name ASC,stte_name ASC
)
);
INSERT INTO defaults_t (screen_name,ctl_name,stte_name,dflt_value)
VALUES ('Screen 1','control 1','NY','Hello'),('Screen 1','XX','Bonjour'),'control 2','World'),'control 3','!');
DECLARE @screen_name VARCHAR(10),@ctl_name VARCHAR(10),@stte_name CHAR(2)
SELECT @screen_name = 'Screen 1',@ctl_name = 'control 1',@stte_name = 'NY';
SELECT
screen_name,dflt_value
FROM
dbo.defaults_t
WHERE
screen_name = @screen_name
AND ctl_name = @ctl_name
AND stte_name ?????;
解决方法
您可以为此使用 OUTER JOIN,但它确实表明默认值可能应该在单独的表中。无论如何,像这样:
SELECT
t.screen_name,t.ctl_name,coalesce(t2.stte_name,t.stte_name) stte_name,coalesce(t2.dflt_value,t.dflt_value) dflt_value
FROM
dbo.defaults_t t
LEFT JOIN DBO.defaults_t t2
on t.ctl_name = t2.ctl_name
and t.screen_name = t2.screen_name
and t2.stte_name = @stte_name
WHERE t.stte_name = 'XX';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。