如何解决如何在 PL/pgSQL 函数中将 WITH 与 IF 一起使用
subprocess.run(shlex.split(entry1.get()))
CREATE OR REPLACE FUNCTION test()
RETURNS boolean security definer AS
$BODY$
BEGIN
with zzz as (select foo from data)
IF EXISTS (select 1 from zzz) THEN
return true;
ELSE
return false;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
问题出在哪里?
解决方法
简化为单个 return 语句:
return exists(select foo from data);
,
就像 Bohemian 提供的那样,您可以从根本上简化为:
RETURN EXISTS(SELECT foo FROM data);
然而,这表明 foo
很重要,它并不重要(如果该列存在,否则会引发异常)。 EXISTS
如果至少返回一行,则返回 true
,无论内容如何:为此目的甚至可以全部为 NULL 值。否则返回 false
。从不null
。减少误导:
RETURN EXISTS(SELECT * FROM data);
RETURN EXISTS(SELECT 1 FROM data);
Postgres 也接受一个空的 SELECT
列表(我的偏好):
RETURN EXISTS(SELECT FROM data);
见:
或者在简单的情况下使用语法简写 TABLE
:
RETURN EXISTS(TABLE data);
见:
PL/pgSQL 对于简单的情况来说是多余的,一个普通的 SQL 函数或者只是一个裸语句都可以:
SELECT EXISTS(TABLE data);
为了将逻辑集成到更复杂的 PL/pgSQL 函数中,特殊变量 FOUND
(如 Adrian commented)通常是有用的。或者 GET DIAGNOSTICS ...
用于动态 SQL。
见:
,最后我使用了:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() async {
String initialRoute;
// handle exceptions caused by making main async
WidgetsFlutterBinding.ensureInitialized();
// init a shared preferences variable
SharedPreferences prefs = await SharedPreferences.getInstance();
// read token
String token = prefs.getString('token');
// use dart's null safety operater
if (token?.isEmpty ?? true)
initialRoute = 'login';
else
initialRoute = '/';
// create a flutter material app as usual
Widget app = MaterialApp(
...
initialRoute: initialRoute,);
// mount and run the flutter app
runApp(app);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。