【问题标题】:How to use PostgreSQL varchar column value in IN query如何在 IN 查询中使用 PostgreSQL varchar 列值
【发布时间】:2020-02-17 17:10:15
【问题描述】:

在 PostgreSQL 数据库中,我们有一个带有 varchar 值的列,其中的值存储如下 [1,2,3,4,5] 我需要在带有 In 子句的函数中检查它。 例如,

--Some SQL Query with many joins
AND OtherTable.PhoneNumber NOT IN((myTable.PhoneNumberJson));

我尝试使用 BLIMIT、RegExReplace 和类型转换值以各种方式传递值,但仍然出现错误。 如何将 varchar object["1,2,3,4,5"] 列表转换为整数并在 IN 子句中使用。

【问题讨论】:

  • 你能发布这两个字段的实际数据类型吗?第二个是数组吗?如果不是,它的格式是否像这样,带有方括号、双引号等?

标签: c# sql arrays json postgresql


【解决方案1】:

在 Postgres 中,您可以使用 the ? operator 来检查 jsonb 数组是否包含给定值:

AND myTable.PhoneNumberJson ? OtherTable.PhoneNumber

请注意,这要求 PhoneNumberJson 的数据类型为 jsonb。如果是json,则可以先投:

AND myTable.PhoneNumberJson::jsonb ? OtherTable.PhoneNumber

【讨论】:

  • 我很抱歉这是我的错,实际上当我更改查询时数据类型不是 json 然后我才注意到它。它实际上是 Varchar 但值将像这样存储 [1,2,3,4,5]
  • @Samaritan_Learner:如果这是您的字符串的确切格式,那么我认为您仍然可以将其转换为 jsonb。请尝试我的回答中的第二个表达式。
  • 抱歉造成误解,还有一个问题是在选择数字时以双精度形式给出,所以我们需要在它工作后也键入 cast 。无论如何,我将您的答案标记为正确答案,因为它为回答的原始问题提供了解决方案。谢谢你。
【解决方案2】:

如果有人正在搜索如何将 varchar 的对象转换和检查为双精度,我将在这里发布我的预期答案。

and not (myTable.Phone_Number = any  
(array(select 
regexp_split_to_table(replace(replace(other_Table.PhoneNumberJson,'[',''),']',''),','):: 
double precision)));

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 2020-04-19
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多