簡體   English   中英

如何將 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;

但我得到這個錯誤:

錯誤:function left(bigint, integer)不存在;

我的桌子是:

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

當您實際使用 PostgreSQL 時,您似乎正在使用 T-SQL 或 JET Red SQL 參考(分別用於 MS SQL 服務器和 MS Access)。

這是字符串函數和其他語法的 PostgreSQL v12 手冊頁。 你應該閱讀它

至於讓您的查詢在 PostgreSQL 上運行,請將其更改為:

  • account_no轉換為varchar類型,以便您可以使用SUBSTRING

    • 我認為沒有它它可能會工作,但我不喜歡依賴隱式轉換,尤其是當本地化/語言環境/文化問題可能會彈出時。
  • 用於提取子字符串的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

這是一個可運行的 DB-Fiddle。

截圖證明:

在此處輸入圖像描述

Postgres函數leftright期望它們的第一個參數是text 因此,首先將account_no轉換為輸入text ,然后您的查詢(有點簡化)將起作用。

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

不相關但 Postgres 下的最佳實踐是使用類型text而不是charvarchar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM