【问题标题】:Postgresql, select empty fieldsPostgresql,选择空字段
【发布时间】:2012-12-19 19:49:56
【问题描述】:

我正在尝试从我的表中获取空的“文本”字段,我使用 pgadmin 手动清除了这些字段。 最初在这些字段中是 '',我可以这样查询它们:

SELECT mystr, mystr1 FROM mytable WHERE mystr='' or mystr1=''

但是,如果我从中删除文本并将单元格留空,那将不起作用。

如何编写查询以将这些''和清除单元格放在一起? 还是单独清除细胞?

【问题讨论】:

  • 字符串是空的还是NULL? (在 postgres 中 ''NULL 是不同的)
  • 我不知道这是什么“空白单元格类型”,只是用 pgadmin 删除了单元格的所有文本。现在我尝试查询 WHERE mystr=NULL OR mystr1=NULL,并没有得到结果。
  • 你不能和NULL比较,NULL不是一个值,它是正交的。你应该改用WHERE mystr IS NULL
  • 嗯,“WHERE mystr='' OR mystr IS NULL OR mystr1='' OR mystr1 IS NULL”仍然找不到所有空字段。我做错了什么?我应该在这里使用一些括号吗?实际上,这再次只返回内部有 '' 的单元格。
  • 请注意'" 是字符串中的有效字符。所以一个字符串可以只包含一两个引号字符。

标签: postgresql


【解决方案1】:
SELECT mystr, mystr1 
FROM mytable 
WHERE COALESCE(mystr, '') = '' 
   OR COALESCE(mystr1, '') = ''
    ;

解释:coalesce(a,b,c, ...) 函数从左到右遍历列表a,b,c,...,并在第一个非空元素处停止。 a,b,c 可以是任何表达式(或常量),但必须产生相同的类型(或可强制转换为相同的类型)。

【讨论】:

  • 谢谢“wildplasser”,从未见过这样的表情或命令。我必须仔细检查这一点。这仍然找不到我的空单元格。幸运的是,通过将数据复制到记事本,我发现在那些“空”单元格中,pgadmin 留了一个空格(chr(32))。所以 WHERE mystr=' ' 给出结果。这里(在 postgresql 中)有一些像 TRIM 这样的函数可以拒绝字符串两边的空格吗?
  • 是的,有一个 TRIM() 函数。它甚至是 ANSI-SQL(就像 COALESCE() 一样)
  • 在最近的一个用例中,我不得不像这样编写 WHERE 子句: WHERE COALESCE(TRIM(parcelid), '') parcelid 字段是 VARCHAR(17),我相信默认情况下数据创建者用空格填充列。
猜你喜欢
  • 2023-03-30
  • 2021-01-12
  • 2012-11-23
  • 2018-09-26
  • 2012-04-05
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多