【问题标题】:Left side of LIKE expression must evaluate to a varchar?LIKE 表达式的左侧必须计算为 varchar?
【发布时间】:2019-06-20 03:53:21
【问题描述】:

我正在编写一个带有基于字段内字符串的过滤器的查询。但是,我正在运行查询,它显示错误:

LIKE 表达式的左侧必须计算为 varchar

我想通过custom_field 购买宝马的每个人进行过滤。

这是自定义字段内的示例数据:

{ "car_model;":"BMWZ4", "car_id":"0980291", "manufacture":"bmw" }

代码:

SELECT
    first_name,
    Last_name,
    country,
    custom_field
FROM 
    sales_table
WHERE 
    custom_field LIKE '%BMWZ4%' 

预期结果

first_name: John   
last_name: Parker      
country: Germany   
custom_field: {"car_model;":"BMWZ4","car_id":"098222291","brand":"bmw"}

【问题讨论】:

  • 你的custom_field是什么类型的?
  • 字段类型为varchar
  • 什么数据库系统,哪个版本? SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...这样的功能通常是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统....(请相应地更新标签)
  • 看起来您的引擎支持 JSON 作为数据类型,您必须查看供应商特定的语法来查询 json。这是哪家供应商?

标签: sql sql-like


【解决方案1】:

您的专栏custom_field 不是随机字符串。它特别是一个 JSON 字符串。实际上,它可能根本不存储为字符串,而是使用称为 JSONB 的二进制格式。

支持 JSON 的数据库(现在几乎是所有主要的)都具有定制的 JSON 函数。您应该使用这些函数来提取模式和值。

通常,将 JSON 列视为其正确类型会比将其视为字符串更有效的查询。一些数据库甚至允许对 JSON 列进行索引。

【讨论】:

    【解决方案2】:
    SELECT
    first_name,
    Last_name,
    country,
    custom_field
    FROM sales_table
    WHERE cast( custom_field as varchar(max)) LIKE '%BMWZ4%' 
    

    【讨论】:

    • SYNTAX_ERROR line 22:5:未知类型:varchar(max)
    • 将 varchar(max) 更改为您的系统等效项,例如 varchar(4000) 或其他任何内容
    • 即使演员表有效,我也不建议这样做,结果查询效率低下
    猜你喜欢
    • 2020-04-29
    • 2015-03-04
    • 2017-11-19
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多