我还不熟悉SQL。我正在编写(实际升级)一个解决邮件的存储过程。
查询如下所示:
SELECT
Greeting_ID,
Client_ID,
Envelope_Greeting,
Letter_Greeting
FROM
t_Cust_Greetings
WHERE
customer_no = 1234
生成如下输出:
Greeting_ID Client_ID Envelope_Greeting Letter_Greeting
----------------------------------------------------------------
1 1234 Mr. and Mrs. John Smith Mr. and Mrs. Smith
3 1234 Mr. and Mrs. John Smith John and Jolene
6 1234 Mr. John Smith Mr. Smith
7 1234 Mr. and Mrs. John Smith Jolene and John
8 1234 Mrs. Jolene Smith Jolene
12 1234 Mrs. Jolene Smith Mrs. Jolene
并非每个客户都有各种类型的问候语,#1是默认问候语。升级后的过程需要选择#7(如果存在),但如果不存在则选择#3,但如果不是#3则选择默认值。通过合并或案例陈述,我没有成功。
你如何在T-SQL中做这样的事情?
答案 0 :(得分:1)
你可以尝试这个,但案例应该有效。我没有安装SQL来测试它。
SELECT TOP(1)
Greeting_ID,
Client_ID,
Envelope_Greeting,
Letter_Greeting
FROM
t_Cust_Greetings
WHERE
Greeting_ID in (7,3,1)
AND customer_no=1234
ORDER BY
Greeting_ID DESC
答案 1 :(得分:0)
您的条件行选择#7(如果存在),但如果不存在则选择#3,但如果不存在#3则转为默认值。可以翻译为选择7,3中的任何一个,或1 。您可以在F(A,B,C,D) = A'D' + ABC + BCD'
条件中包含IN
运算符,例如
WHERE
因为你在程序块中执行此操作;你也可以使用WHERE Greeting_ID IN (7, 3, 1)
构造。
答案 2 :(得分:0)
理想情况下,您应该将所需的订单存储在单独的表中,然后按顺序排列。但是使用你拥有的东西你可以试试......
SELECT top 1
Greeting_ID,
Client_ID,
Envelope_Greeting,
Letter_Greeting
FROM
t_Cust_Greetings
WHERE
customer_no = 1234
ORDER BY CASE Greeting_ID
WHEN 7 THEN 1
WHEN 3 THEN 2
WHEN 1 THEN 3
ELSE 4
END
答案 3 :(得分:0)
您的SQL平台可能不允许使用如下所示的表 - 替换您自己的临时表或表变量或case语句。
select top 1 *
from t_Cust_Greetings hiYa
join ( values
(7,1)
, (3,2)
, (1,3)
) Prefs (value,weight)
on hiYa.Greeting_ID = Prefs.value
where customer_no = 823165
order by Prefs.weight