相关疑难解决方法(0)

在PostgreSQL中插入带单引号的文本

我有一张桌子test(id,name).

我需要插入样值: user's log,'my user',customer's.

 insert into test values (1,'user's log');
 insert into test values (2,''my users'');
 insert into test values (3,'customer's');
Run Code Online (Sandbox Code Playgroud)

如果我运行上述任何语句,我会收到错误.

如果有任何方法可以正确地做到这一点请分享.我不想要任何准备好的陈述.

是否可以使用sql转义机制?

postgresql quotes insert special-characters

377
推荐指数
5
解决办法
32万
查看次数

如何在PostgreSQL中使用RETURNING和ON CONFLICT?

我在PostgreSQL 9.5中有以下UPSERT:

INSERT INTO chats ("user", "contact", "name") 
           VALUES ($1, $2, $3), 
                  ($2, $1, NULL) 
ON CONFLICT("user", "contact") DO NOTHING
RETURNING id;
Run Code Online (Sandbox Code Playgroud)

如果没有冲突,则返回如下内容:

----------
    | id |
----------
  1 | 50 |
----------
  2 | 51 |
----------
Run Code Online (Sandbox Code Playgroud)

但如果存在冲突,则不会返回任何行:

----------
    | id |
----------
Run Code Online (Sandbox Code Playgroud)

id如果没有冲突,我想返回新列,或者返回id冲突列的现有列.
可以这样做吗?如果是这样,怎么样?

sql postgresql upsert sql-returning

127
推荐指数
7
解决办法
4万
查看次数

遗忘的赋值运算符"="和常见的":="

PL/pgSQL的文档说,变量的声明和赋值完成:=.但是简单,更短,更现代 (见脚注) =似乎按预期工作:

    CREATE OR REPLACE FUNCTION foo() RETURNS int AS $$
    DECLARE
      i int;
    BEGIN
      i = 0;  
      WHILE NOT i = 25 LOOP
          i = i + 1;
          i = i * i;
      END LOOP;
      RETURN i;
    END;
    $$ LANGUAGE plpgsql;

    > SELECT foo();
    25
Run Code Online (Sandbox Code Playgroud)

请注意,Pl/pgSQL可以清楚地区分分配和比较,如行中所示

      WHILE NOT i = 25 LOOP
Run Code Online (Sandbox Code Playgroud)

所以,问题是:

  • 我没有在文档中找到提及和/或解释这个的部分吗?
  • 是否有使用=代替的已知后果:=

编辑/脚注:

请使用" 简短,不完整和错误的编程语言历史 "中的"更现代"部分:

1970年 - Niklaus Wirth创建了Pascal,一种程序语言.批评者立即谴责Pascal,因为它使用"x:= x + y"语法而不是更熟悉的类C"x = x + y".尽管C还没有被发明,但这种批评仍在发生. …

postgresql plpgsql assignment-operator colon-equals

41
推荐指数
2
解决办法
8254
查看次数

SELECT或INSERT是否容易出现竞争条件?

我写了一个函数为一个简单的博客引擎创建帖子:

CREATE FUNCTION CreatePost(VARCHAR, TEXT, VARCHAR[])
RETURNS INTEGER AS $$
    DECLARE
        InsertedPostId INTEGER;
        TagName VARCHAR;
    BEGIN
        INSERT INTO Posts (Title, Body)
        VALUES ($1, $2)
        RETURNING Id INTO InsertedPostId;

        FOREACH TagName IN ARRAY $3 LOOP
            DECLARE
                InsertedTagId INTEGER;
            BEGIN
                -- I am concerned about this part.
                BEGIN
                    INSERT INTO Tags (Name)
                    VALUES (TagName)
                    RETURNING Id INTO InsertedTagId;
                EXCEPTION WHEN UNIQUE_VIOLATION THEN
                    SELECT INTO InsertedTagId Id
                    FROM Tags
                    WHERE Name = TagName
                    FETCH FIRST ROW ONLY;
                END;

                INSERT INTO Taggings (PostId, TagId) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql concurrency upsert plpgsql

25
推荐指数
2
解决办法
8449
查看次数

什么在EXISTS子查询中更容易阅读?

这是一个可读性问题.性能没有区别.
旧版本的SQL Server足以查找元数据,但不再是.

SELECT foo FROM bar WHERE EXISTS (SELECT * FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1 FROM baz WHERE baz.id = bar.id);
Run Code Online (Sandbox Code Playgroud)

我不是在考虑对我来说似乎不直观的NULL或"有趣变体".

SELECT foo FROM bar WHERE EXISTS (SELECT NULL FROM baz WHERE baz.id = bar.id); SELECT foo FROM bar WHERE EXISTS (SELECT 1/0 FROM baz WHERE baz.id = bar.id);

刚刚在评论中提出了这个问题.我研究了最流行的RDBMS的手册:

sql syntax exists

12
推荐指数
3
解决办法
2463
查看次数

检查行类型时,为什么IS NOT NULL为false?

我有一个函数registration(),它应该在某些情况下向表添加一行.我已经包含了一段代码和来自通话的输出.

如果select *返回一个非空表行(它根据它执行RAISE NOTICE),我想引发异常而不添加行.该示例似乎表明它rowt不是null,但仍然rowt IS NOT NULL返回f(并且不会引发异常).

我希望这是我看不到的小事.

select * into rowt from Email where email_email = eml;
RAISE NOTICE '%, rowt IS NOT NULL:%',rowt, rowt IS NOT NULL;
if rowt IS NOT NULL THEN
   RAISE EXCEPTION 'email address, %, already registered.' , eml;
END IF;
Run Code Online (Sandbox Code Playgroud)

输出:

NOTICE:  (7,,,), rowt IS NOT NULL:f

registration 
--------------
    21
(1 row)

CREATE TABLE IF NOT EXISTS Email ( 
   email_email VARCHAR(50) NOT …
Run Code Online (Sandbox Code Playgroud)

postgresql null row plpgsql

8
推荐指数
3
解决办法
4357
查看次数

函数或过程名称的别名

我遇到了下一篇文章中定义的问题,第一个答案解决了我将参数命名为与表列同名的主要问题。我的新担忧是我的函数/过程参数被广泛使用,并且我的函数/过程的名称相当详细。

PL/pgSQL 列名与变量相同

有没有办法为函数或过程名称定义别名 - 在其体内使用?

当前代码:

CREATE OR REPLACE PROCEDURE dbo.PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID)
  LANGUAGE plpgsql AS
$BODY$
DECLARE
BEGIN
    Delete from dbo.Table t where PR_DeleteCrazyNamedItemByCrazyNamedID.NamedID = t.NamedID;
...
Run Code Online (Sandbox Code Playgroud)

所需代码:

CREATE OR REPLACE PROCEDURE dbo.PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID) as proc
  LANGUAGE plpgsql AS
$BODY$
DECLARE
BEGIN
    Delete from dbo.Table t where proc.NamedID = t.NamedID;
...
Run Code Online (Sandbox Code Playgroud)

postgresql alias stored-procedures plpgsql

4
推荐指数
1
解决办法
1443
查看次数

如果函数的参数与列名相同怎么办

我有一个 SQL 函数,其参数名称为 id。但是,我有一个具有相同名称 id 的列名。我如何告诉函数如何区分参数和列。如果我将参数名称从 id 更改为 num,我的函数可以完美运行,但这不是这里的选项,而且我也无法更改列名称。

create or replace function
    test(id integer) return text
as $$
    select address
    from customers c
    where c.id = id
$$ language sql;
Run Code Online (Sandbox Code Playgroud)

sql database postgresql sql-function

3
推荐指数
1
解决办法
1977
查看次数