如何解决IN-Clause 后的 WHERE-Clause 和 CASE-Statment 不起作用
我已经为此工作了几个小时,但我不知道如何解决这个问题。
这是关键的 WHERE 子句:
WHERE Statistic.CustomerID in (
CASE
WHEN Customer.Address is null THEN '14165'
ELSE
(select ID FROM Customer where Address = (select Address from Customer where ID = '14165')) END)
问题仅在 Customer.Address
not NULL 时发生。
但是当我只在 ELSE-Block 中执行查询时。当我单独执行 ELSE-Block 中的语句时,它返回多个有效值。
为了更好地理解:我有一个应用程序来导入客户数据。但有时会发生重复,然后用户有可能将导入的客户分配给现有客户。 (那是当 customer.Address 不为空时 - 分配将导入的客户与另一个数据库表中的现有客户联系起来)。
我在一张表中有客户主数据(姓名、地址、联系信息...),在另一张表中有销售统计数据。
简化表格
客户
姓名 | ID | 地址 |
---|---|---|
约翰内斯 | 1 | 123 |
鲍里斯 | 2 | 123 |
麦莉 | 3 | NULL |
奇桑德拉 | 4 | 456 |
统计数据
产品名称 | ID | 客户 ID |
---|---|---|
黄瓜 | 1 | 1 |
番茄 | 2 | 1 |
黄瓜 | 1 | 2 |
南瓜 | 3 | 2 |
胡萝卜 | 5 | 2 |
我想返回一位内部客户的所有产品数据,Customer.Address 不为空。为了更好地理解:Johannes 和 Boris 是两个进口客户,他们与 ID 为“123”的内部客户相关联。如果用户选择 ID 为“123”的内部客户,他应该会看到所有相关的导入产品静态数据。
在这种情况下:
期望输出
产品名称 |
---|
黄瓜 |
番茄 |
黄瓜 |
南瓜 |
有人能帮我解决这个问题并解释为什么这个方法不起作用吗?
谢谢。
解决方法
这正是问题所在,正如您自己提到的:
ELSE-Block 单独返回多个有效值
CASE 不能返回多个值, 在您的情况下,它可以从子查询返回“14165”或单个值。
这是解决您的问题的替代sql:
WHERE Statistic.CustomerID IN
(
SELECT '14165'
WHERE Customer.Address IS NULL
UNION
SELECT ID
FROM Customer AS C
WHERE Address = (SELECT Address FROM Customer WHERE ID = '14165')
AND Customer.Address IS NOT NULL
)
或者甚至更好地这样做:
WHERE Statistic.CustomerID IN
(
SELECT '14165'
WHERE Customer.Address IS NULL
UNION
SELECT C_Alike.ID
FROM Customer AS C_14165
JOIN Customer AS C_Alike ON C_Alike.Address = C_14165.Address
WHERE C_14165.ID = '14165'
AND Customer.Address IS NOT NULL
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。