选择带有“case”的变量表达

发布于 2025-01-11 11:39:01 字数 669 浏览 0 评论 0原文

我试图用 select 语句中的 case 结果分配一个变量。 我尝试了不同的方法:

DO $$
BEGIN
    declare truefalse varchar(100);

    SELECT truefalse = CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$$

然后

DO $$
BEGIN
    declare truefalse varchar(100);

    SELECT CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END 
    into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$$

还使用其他“case”语法:case when x=y then z else r end。 到目前为止没有运气 - 我收到错误消息: 类型“truefalse”不存在。 任何人都可以阐明我的错误吗?

I'm trying to assign a variable with the result of a case within a select statement.
I've tried different approaches:

DO $
BEGIN
    declare truefalse varchar(100);

    SELECT truefalse = CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

and then

DO $
BEGIN
    declare truefalse varchar(100);

    SELECT CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END 
    into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

and also with the other "case" syntax: case when x=y then z else r end.
No luck so far - I get error message:
type "truefalse" does not exist.
Can anyone shed light on my error?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沉睡月亮 2025-01-18 11:39:01

如手册中所述declare部分在开始之前。如果您这样做,您的第二个 PL/pgSQL 块将起作用。

DO $
DECLARE
  truefalse varchar(100);
BEGIN
    SELECT CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END 
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

但为什么不使用适当的布尔值呢?

DO $
DECLARE
  truefalse boolean;
BEGIN
    SELECT cfgvalue = 'TRUE'
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

如果 cfgvalue 始终存储字符串 'TRUE''FALSE',您甚至可以直接转换它:

    SELECT cfgvalue::boolean
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';

As documented in the manual, the declare section goes before the begin. If you do that, your the second PL/pgSQL block will work.

DO $
DECLARE
  truefalse varchar(100);
BEGIN
    SELECT CASE cfgvalue when 'TRUE' THEN 'FALSE' ELSE 'TRUE' END 
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

But why not use a proper boolean value?

DO $
DECLARE
  truefalse boolean;
BEGIN
    SELECT cfgvalue = 'TRUE'
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
END;
$

If the cfgvalue always stores the strings 'TRUE' and 'FALSE' you can even cast it directly:

    SELECT cfgvalue::boolean
      into truefalse
    from cfg where cfglabel = 'DO_NOT_DISPLAY_WORK_ITEMS_IN_RECEIPT_CONFIRMATION_WIN';
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文