【问题标题】:Combine two columns and perform a where operation on the result合并两列并对结果执行 where 操作
【发布时间】:2021-01-11 01:17:22
【问题描述】:

我有两列,一列用于“firstName”,另一列用于“lastName”。我正在尝试对这两个列的串联执行 where 操作以匹配全名。

这是我尝试过的:

select * from table where concat_ws(' ', 'firstName', 'lastName') like '%some_value%'

这只是返回一个空白数组。

示例数据:

firstName lastName
Clayton Smith
Barbara Clayman
Sam Peterson

当 some_value = Clay 时,它应该返回 'Clayton Smith' 和 'Barbara Clayman'

我从其他一些 stackoverflow 答案中得到了很多这种语法,这些答案被标记为类似问题的解决方案,但是当我自己实现这个时,我无法让它工作。

FWIW 我将使用 knex.js 构建这些查询,所以如果有 knex.js 特定的解决方案,请随时回答。

【问题讨论】:

  • 样本数据对您的问题有很大帮助。
  • 更新了一些数据
  • 这是一个文字字符串模式。您需要将变量/参数与百分比字符连接起来。你似乎期望插值发生在那里。
  • @shawnt00 你能举例说明你的意思吗?

标签: sql postgresql knex.js


【解决方案1】:

CONCAT_WS 调用的参数应该用双引号引起来。如果它们在单引号中,Postgres 会将它们解释为字符串文字。这应该有效:

SELECT * FROM table WHERE CONCAT_WS(' ', "firstName", "lastName") ILIKE '%some_value%'

我还建议使用ILIKE 而不是LIKE - 这将使您的搜索词的模式匹配不区分大小写。

【讨论】:

    【解决方案2】:

    使用STR_POS

    PostgreSQL strpos() 函数用于查找字符串中子字符串匹配的位置。

    https://w3resource.com/PostgreSQL/strpos-function.php#:~:text=The%20PostgreSQL%20strpos()%20function,being%20matched%20within%20the%20string.&text=Example%20of%20PostgreSQL%20STRPOS(),within%20the%20argument%20is%205.

    select * from table where strpos(concat_ws(' ', first_name, last_name),'Clay') > 0

    用变量替换文字

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多