【问题标题】:Use of LIKE in PostgreSQL with brackets在 PostgreSQL 中使用带括号的 LIKE
【发布时间】:2018-10-16 22:12:01
【问题描述】:

我尽量做到具体。

目前我使用的是 MS SQL Server 2012。

一个简化表 PlanMission 包含这些行

|---------------------|---------------------|
|      Bold_Id        |   MCurrentStates    |
|---------------------|---------------------|
|      10776          |[original[scheme]    |
|---------------------|---------------------|
|      10777          |[operative][inproc]  |
|---------------------|---------------------|
|      10778          |[operative][closed]  | 
|---------------------|---------------------|
|      10779          |[operative][planopen]|
|---------------------|---------------------|

Bold_id 列只是一个唯一的 ID。 MCurrentStates 列是一个 VARCHAR 列,其中包含状态作为子字符串。

状态只是一个用括号括起来的字符串,例如 [planopen] 所以该列可能是空的或有许多状态,如上面的示例。

如果我愿意,在 MS SQL 中

SELECT  Bold_Id, MCurrentStates 
FROM PlanMission 
WHERE MCurrentStates LIKE '%[planopen]%'

它不起作用。它只是列出了 MCurrentStates 中所有非空的行。

通过插入[]解决

SELECT  Bold_Id, MCurrentStates 
FROM PlanMission 
WHERE MCurrentStates LIKE '%[[]planopen]%'

效果很好。

现在我也想为 PostgreSQL 做这件事。 简单的解决方案是删除括号。

但我的问题是如何使用对 MS SQL 和 PostgreSQL 都相同的查询来做到这一点?

【问题讨论】:

  • 你不应该像这样在单个列中存储多个值。
  • "... 两者都相同..." 数据库引擎不使用相同的 sql 方言。所以简短的回答是您使用您使用的那些引擎支持的通用ansi sql级别编写代码,或者您为不同的引擎编写不同的代码。你选。当然,适当地规范化您的表格以避免像您现在遇到的问题。

标签: sql sql-server postgresql database-agnostic


【解决方案1】:

试试:

SELECT  Bold_Id, MCurrentStates 
FROM PlanMission 
WHERE MCurrentStates LIKE '%/[planopen/]%' ESCAPE '/';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多