【问题标题】:How to compare character varying (varcar) to UUID in PostgreSQL?如何在 PostgreSQL 中将字符变化(varchar)与 UUID 进行比较?
【发布时间】:2019-03-21 17:47:26
【问题描述】:

运算符不存在:字符变化 = uuid

客户端 ID 是 UUId,应该是它不起作用的原因。

我错了,因为我几乎尝试了我想象的所有东西。

SELECT * FROM "cobranca_assinatura"
INNER JOIN "cadastro_cliente" ON ("cobranca_assinatura"."cliente_id" = "cadastro_cliente"."id")
WHERE "cadastro_cliente"."nome" LIKE marcelo% ESCAPE '\'

[2019-03-21 14:40:34] [42883] 错误:运算符不存在: 字符变化 = uuid [2019-03-21 14:40:34] Dica:没有操作员 匹配给定的名称和参数类型。您可能需要添加 显式类型转换。

【问题讨论】:

  • "cadastro_cliente"."id"的数据类型有哪些?和"cobranca_assinatura"."cliente_id"?
  • 驯服者。是 uuid。
  • "cobranca_assinatura"."cliente_id" 是 Varchar
  • 就是这样,错误是不言自明的。您正在比较两种不同的数据类型,在比较之前必须将一种类型转换为另一种类型。

标签: postgresql


【解决方案1】:

uuid 是一种特定的数据类型。对你来说,它看起来像文本,但它不是。不能用字符串函数(uuid like "abc%")比较uuid,也不能和文本比较。

正如 Tamer 建议的那样,如果需要比较,您可以先投射它。

SELECT * 
FROM (SELECT 'A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'::uuid as my_uuid) foo 
WHERE my_uuid::text like 'a%'

例如,上面我通过将字符串转换为 uuid 类型来创建 uuid。 (如果您尝试将任何旧字符串转换为 uuid,您将失败,因为 'abc' 不能 是 uuid)。

然后使用名为“my_uuid”的 uuid 项,我将其转换回字符串以使用字符串比较。 (注意“A”变成了“a”!)

【讨论】:

  • 展示如何将其投射以进行比较将使这是一个正确的答案。
  • 虽然这个答案是可以接受的并且确实有帮助,但如果对您在上面提供的关于您如何使用投射的查询进行细分,对其他人会更有益
  • 是的,@Oozeerally。我是新手。在练习查询时,我遇到了同样的问题。但我无法理解这一点,所以我再次研究这个答案以详细了解。
  • @Himabindu 我在下面添加了答案,如果您使用的是 java,这可能有助于您轻松理解。
【解决方案2】:

在 java -> 用于 JDBC 模板的 spring boot。我遇到了同样的问题。这是类型不匹配错误,它需要 UUID 数据类型但提供字符串。 因此,我使用 UUID.fromString() 并在准备好的语句 (SQL) 中使用 UUID 类型从 String 转换 UUID

例子:

String testSelectQry = "SELECT * from facility_announcements where id=:announcementID";
SqlParameterSource params = new MapSqlParameterSource("announcementID", UUID.fromString("094b76da-4140-11eb-b139-0242ac11000f"));
namedParameterJdbcTemplate.query(testSelectQry, params, new FacilityAnnouncementMapper());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2015-08-14
    • 2018-06-04
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多