查询 Postgres 数据库

Posted

技术标签:

【中文标题】查询 Postgres 数据库【英文标题】:Querying Postgres database 【发布时间】:2015-08-17 14:16:56 【问题描述】:

我想查询一个数据库,其中一个列与一个字符串匹配并且这个字符串有一个单引号字符'。我无法运行以下查询

SELECT * 
from <table> 
where <column>='robocopy'w (ithout)backup.pcap';

原因是单引号用于搜索列; 我尝试了双引号但没有帮助。 如果我在字符串中的单引号之前添加一个额外的单引号,我可以绕过这个。

SELECT * 
from <table> 
where <column>='robocopy''w (ithout)backup.pcap';

但我需要一个更好的解决方案,因为每次都添加单引号是不切实际的,特别是如果它们很长并且有很多单引号。

【问题讨论】:

你如何运行这个?从程序内部?如果是,哪种编程语言?您是否将搜索值作为参数传递?您如何传递该搜索值?你从哪里得到它? 是来自 perl 脚本,是的搜索值是我从文件中读取并使用变量将其放入此查询的参数。 问题不是我从脚本运行,我也不能直接运行。如果我能解决这个问题,我可以相应地修改脚本。 双美元解决了我的问题.. select path from table where path=$$\Script_test(special_characters)\robocopy'w (ithout)backup.pcap$$;这工作:) 感谢您的帮助 【参考方案1】:

您需要在将查询字符串发送到数据库之前对其进行转义。我不能告诉你怎么做,因为你没有发布代码,但是如果你直接在 psql 控制台中运行这个查询,你可以通过将所有约束放在 $$ 和 $$ 中来转义引号,如文档中所引用[1]。示例:

SELECT * from <table> where <column> = $$robocopy'w (ithout)backup.pcap$$;

[1]http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

【讨论】:

不,你不会。单引号通过在 SQL 中加倍来转义。 \' 没有特殊含义,除非 Postgres 被配置为接受非标准字符串(并且“符合标准的字符串”在很长一段时间以来一直是默认值)。 感谢 chromano 的快速响应。这是我可以查询的列条目,如果我给出部分路径: select path from where path='%(ithout)backup.pcap%';小路 - - - - - - - - - - - - - - - - - - - - - - - - - ---------------- \Script_test(special_characters)\robocopy'w (ithout)backup.pcap 现在如果我尝试搜索整个条目它不会运行并且不会返回任何错误, 如果我改用双引号,则会引发语法错误。
中选择路径 where path='\Script_test(special_characters)\robocopy'w (ithout)backup.pcap'; r 请注意,这里的 \ 不是转义字符,它是表中字符串的一部分,如果我在字符串中的单引号之前添加一个额外的单引号,我可以运行此查询。从
中选择路径,其中 path='\Script_test(special_characters)\robocopy''w (ithout)backup.pcap';小路 - - - - - - - - - - - - - - - - - - - - - - - - - ---------------- \Script_test(special_characters)\robocopy'w (ithout)backup.pcap (1 row) 我发布这个的原因是因为我正在从文件中一一读取路径,并且我不知道字符串中有多少次单引号。那么有什么替代方法我不必每次都加上额外的单引号并仍然查询数据库吗?在这种情况下,在检查 pgsql 文档后,我会选择这个解决方案:postgresql.org/docs/current/interactive/…

以上是关于查询 Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

优化 postgres 数据库和查询的不同步骤是啥?

查询 Postgres 数据库

运行缓慢的 Postgres 查询

如何在 Diesel 中对 Postgres 数据库执行删除子查询?

Python - 使用 sqlalchemy 的 Postgres 查询返回“空数据框”

如何查询postgres数据库以获取某些坐标10公里半径内的所有点