gpt4 book ai didi

Oracle 在 WHERE 子句中使用 CASE 语句

转载 作者:行者123 更新时间:2023-12-02 08:58:31 24 4
gpt4 key购买 nike

下面是我尝试在 WHERE 子句中包含 CASE STATMENT 的尝试,但它不起作用。有人知道我该如何纠正这个问题吗?

PROCEDURE GetBatchTotals(pEntityName VARCHAR DEFAULT NULL) IS

BEGIN

-- Sample Query
SELECT
e.ColumnName
FROM
Schema.TableName e
WHERE
(
CASE
WHEN pEntityName IS NULL THEN
e.ColumnName != '' -- Just to select everything in the table
ELSE
e.ColumnName = pEntityName
END
);

END GetBatchTotals;

我似乎无法理解我已经发布的示例。这是不使用 CASE 语句但不返回结果的另一次尝试:

SELECT
e.ColumnName
FROM
Schema.TableName e
WHERE
(pEntityName IS NULL AND e.ColumnName != '') OR
(pEntityName IS NOT NULL AND e.ColumnName = pEntityName);

无论如何,这是不返回结果的真实示例查询: enter image description here

这是包含数据的表格: enter image description here提前致谢。

最佳答案

永远不要忘记,在 Oracle SQL 中,'' 文字(空字符串)与 NULL 相同,因此您的谓词 e.ColumnName != '' 相当于 e.ColumnName != null,其计算结果始终为 NULL

第二个问题是您正在尝试从 CASE 输出 bool 值。不可以,Oracle 不能使用 bool 表达式作为函数的结果。 (让我们将 CASE 视为一个函数,因为我现在记不起这些语言结构的更合适的名称。)

尝试这样:

PROCEDURE GetBatchTotals(pEntityName VARCHAR DEFAULT NULL) IS
BEGIN
-- Sample Query
SELECT ColumnName
FROM TableName e
WHERE
(pEntityName IS NULL AND e.ColumnName is not null) OR
(pEntityName IS NOT NULL AND e.ColumnName = pEntityName);
END GetBatchTotals;

您的代码还有一些问题,让我们修复它们:

(1)不要使用 varchar,而是使用 varchar2。 Oracle 的一个奇怪的“增强”,别问。

(2)对于具有非 NULL 值的相等谓词,您可以从 AND 之一中省略谓词 pEntityName is not null,它将是暗示。

(3)谓词 e.ColumnName is not null 确实过滤掉了 e.ColumnNameNULL 的行,这与您最初的查询想法不同所有行,无论其 e.ColumnName 值如何。

(4)循环遍历查询结果或批量将它们获取到集合或将它们作为引用游标返回。在 PL/SQL 中,您必须将查询结果放入某些内容中!让我们循环遍历查询结果并将 ColumnName 内容假脱机到服务器输出...

PROCEDURE GetBatchTotals(pEntityName VARCHAR2 DEFAULT NULL) IS
BEGIN
for rec in (
SELECT ColumnName
FROM TableName e
WHERE pEntityName IS NULL -- Just to select everything in the table
OR e.ColumnName = pEntityName
) loop
dbms_output.put_line(rec.ColumnName);
end loop;
END GetBatchTotals;

关于Oracle 在 WHERE 子句中使用 CASE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43994835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com