sql - CASE WHEN 将结果集分配给查询
问题描述
我一直在尝试根据输入为查询分配不同的结果集
根据选择的公司,应该显示一组过滤结果,这是我的代码。
DECLARE @COMPANY VARCHAR(10) = 'Company_name1'
SELECT
(CASE
WHEN @COMPANY = 'Company_name1'
THEN (SELECT INVENTLOCATIONID FROM INVENTDIM INV
WHERE (INV.DATAAREAID = @COMPANY)
AND (((INVENTLOCATIONID IS NOT NULL)
AND ((WMSLOCATIONID IS NOT NULL)
AND (WMSLOCATIONID <> '')))
AND (INV.INVENTLOCATIONID = 'x5'))
WHEN @COMPANY = 'Company_name2'
THEN (SELECT INVENTLOCATIONID FROM INVENTDIM INV
WHERE (INV.DATAAREAID = @COMPANY)
AND (((INVENTLOCATIONID IS NOT NULL)
AND ((WMSLOCATIONID IS NOT NULL)
AND (WMSLOCATIONID <> '')))
AND (INVENTLOCATIONID IN ('X0', 'X1', 'X2', 'X3', 'X5', 'X6', 'X8', 'P6', 'P8')))
ELSE (SELECT INVENTLOCATIONID FROM INVENTDIM INV
WHERE (DATAAREAID = @COMPANY)
AND ((INVENTLOCATIONID IS NOT NULL)
AND ((WMSLOCATIONID IS NOT NULL)
AND (WMSLOCATIONID <> '')))
END) AS WHAREWOUSE
FROM
INVENTDIM INV
ORDER BY
INV.INVENTLOCATIONID
为什么我不允许这样做?
解决方案
CASE
这是您可以使用表达式执行此操作的一种方法。使用常量来拒绝公司名称与特定案例匹配且位置不在您的列表中的条目。如果公司不是特例之一,那就接受吧。
DECLARE @COMPANY VARCHAR(10) = 'Company_name1';
SELECT WHAREHOUSE = INVENTLOCATIONID
FROM dbo.INVENTDIM
WHERE DATAAREAID = @COMPANY
AND INVENTLOCATIONID IS NOT NULL
AND WMSLOCATIONID IS NOT NULL
AND WMSLOCATIONID <> ''
AND 1 =
(
CASE
WHEN DATAAREAID = 'Company_name1'
AND INVENTLOCATIONID <> 'x5'
THEN 0
WHEN DATAAREAID = 'Company_name2'
AND INVENTLOCATIONID NOT IN ('X0','X1','X2','X3','X5','X6','X8','P6','P8')
THEN 0
ELSE 1
END
)
ORDER BY INVENTLOCATIONID;
但是,除非DATAAREAID
是唯一的,否则查询计划重用可能是一场灾难。
您能否创建一个新的交叉引用表以允许数据库将公司映射到 inventlocationid?– Zynon Putney II
假设您有一个映射表,例如:
CREATE TABLE dbo.LocationMap
(
DATAAREAID varchar(10),
INVENTLOCATIONID char(2),
PRIMARY KEY(DATAAREAID, INVENTLOCATIONID
);
INSERT dbo.LocationMap(DATAAREAID,INVENTLOCATIONID)
VALUES
('Company_Name1', 'x5'),
('Company_Name2', 'X0'), ('Company_Name2', 'X1') -- , ...
然后您的查询变为:
DECLARE @COMPANY VARCHAR(10) = 'Company_name1';
SELECT WHAREHOUSE = INV.INVENTLOCATIONID
FROM dbo.INVENTDIM AS INV
LEFT OUTER JOIN dbo.LocationMap AS lm
ON INV.DATAAREAID = lm.DATAAREAID
WHERE INV.DATAAREAID = @COMPANY
AND INV.INVENTLOCATIONID IS NOT NULL
AND INV.WMSLOCATIONID IS NOT NULL
AND INV.WMSLOCATIONID <> ''
AND (lm.INVENTLOCATIONID = INV.INVENTLOCATIONID
OR lm.DATAAREAID IS NULL)
ORDER BY INV.INVENTLOCATIONID;
推荐阅读
- java - 如何使用 oAuth2 通过 EWS 访问 Exchange Server 中的特定邮箱
- reactjs - 是否可以为 React 更改 IBM Carbon Search 组件上的放大镜图标?
- javascript - React.js - 在 componentDidMount() 中调用函数时状态不会更新
- django - 使用 Pillow 访问数据会在 Django Rest Framework 中响应时损坏数据(您上传的文件不是图像或损坏的图像。)
- c# - EF Core 数据库操作引发错误“自加载实体以来数据可能已被修改或删除”
- python-3.x - 如何使用 Selenium 打开 google-chrome-devtools 并将切换设备工具栏设置为特定设备(例如:iPhone X)?
- protractor - 等待和睡眠在量角器上不起作用
- sql - 为什么在 Postgres 中查询表 pg_enum 时结果的顺序会有所不同?
- node.js - 从 --watch 标志重新启动应用程序后运行“pm2 save”
- python - 根据标准重塑数据框和计数值