【问题标题】:delete rows and specific condition删除行和特定条件
【发布时间】:2015-08-19 15:13:46
【问题描述】:

我正在尝试执行this 之类的操作,但我不断收到“HELLO”列不存在的错误消息。我试图运行的查询是:

delete from lib."table1" where "word"<>"HELLO" and "Language"="English"

基本上我正在尝试删除“语言”列中包含英语的所有行,但不删除“单词”列中包含“HELLO”的行。因此它应该跳过 Language = English 和 word = HELLO 的行,但删除所有其他带有 English in Language 或 HELLO in word 的行。我究竟做错了什么? (如果我取出“word ...ELLO”部分,它可以正常工作,但会删除每个英文行)。

【问题讨论】:

标签: sql postgresql sql-delete


【解决方案1】:

对于 postgres,双引号不用于字符串,而是用于列名等

delete from lib."table1" where "word"!='HELLO' and "Language"='English'

【讨论】:

  • 您最好将&lt;&gt; 用于not equals
  • 不仅仅是“用于 postgres”。这是在 SQL 标准中指定的方式。 SQL 标准确实为“不等于”运算符定义了&lt;&gt;
  • 对于 postgres &lt;&gt;!= 工作不等于 Comparison Operators
  • 这很好用——我把引号搞砸了(使用 python 和字符串插入,所以我的引号被关闭了)。谢谢!
  • 来自手册:!= 运算符在解析器阶段转换为 。很公平,但为了便于阅读,我不希望在 . 旁边看到字符串
【解决方案2】:

对字符串字面量使用单引号,对列名使用双引号:

delete from lib."table1" where word <> 'HELLO' and Language = 'English';

附带说明:如果您想保留在列中某处包含单词的英文行(例如,也匹配“Hello World”),那么您可能希望使用not like 运算符,如下所示:

delete from table1 
where word not like concat('%','HELLO','%') and Language = 'English';

【讨论】:

  • 为什么是concat()?为什么不直接使用'%HELLO%'
  • @a_horse_with_no_name 好问题。猜猜我没有考虑清楚,但重用了一个模式,其中字符串文字本来是来自另一列的字符串,在这种情况下当然不需要。
猜你喜欢
  • 2022-01-23
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2020-11-18
相关资源
最近更新 更多