如何将 T-SQL 查询转换为连接子字符串的 PostgreSQL?

How do I convert a T-SQL query to PostgreSQL that concatenates substrings?

这是我的查询:

SELECT
    *,
    CONCAT(
        RIGHT( account_no, 4),
        RIGHT( customer_id, 5 )
    ) AS "password for my diplomo"
FROM
    account_info;

但是我得到这个错误:

Error: function left(bigint, integer) does not exist;

我的table是:

CREATE TABLE account_info (
    account_no  bigint       NOT NULL PRIMARY KEY,
    customer_id varchar(...)
)

当您实际使用 PostgreSQL 它使用完全不同的函数(和语法)进行 string/text 处理。

This is the PostgreSQL v12 manual page for string functions and other syntax. You should read it.

至于在 PostgreSQL 上进行查询 运行,将其更改为:

  • account_no 转换为 varchar 类型,以便您可以使用 SUBSTRING

    • 我认为没有它它可能会起作用,但我不喜欢依赖隐式转换,尤其是当 localization/locale/culture 问题可能会弹出时。
  • 提取子字符串的LEFTRIGHT函数可以像这样重新实现:

    LEFT( text, length ) == SUBSTRING( text FROM 0 FOR length )
    RIGHT( text, length ) == SUBSTRING( text FROM CHAR_LENGTH( text ) - length )
    
  • 并使用 || 将文本值连接在一起。

像这样:

SELECT
    q.*,
    (
        SUBSTRING( q.account_no_text FROM CHAR_LENGTH( q.account_no_text ) - 4 )
        ||
        SUBSTRING( q.customer_id FROM CHAR_LENGTH( q.customer_id ) - 5 )
    ) AS "password for my diplomo"
FROM
    (
        SELECT
            ai.*,
            ai.account_no::varchar(10) AS account_no_text
        FROM
            account_info AS ai
    )
        AS q

Here is a runnable DB-Fiddle.

截图证明:

Postgres functions leftright 期望他们的第一个参数是 text。 因此,首先将 account_no 强制转换为 text 并且您的查询(有点简化)将起作用。

SELECT *,
       right(account_no::text, 4) || right(customer_id, 5) as pfmd
FROM account_info;

无关,但 Postgres 下的最佳做法是使用类型 text 而不是 charvarchar.