如何将 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 问题可能会弹出时。
提取子字符串的LEFT
和RIGHT
函数可以像这样重新实现:
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
截图证明:
Postgres functions left
和 right
期望他们的第一个参数是 text
。
因此,首先将 account_no
强制转换为 text
并且您的查询(有点简化)将起作用。
SELECT *,
right(account_no::text, 4) || right(customer_id, 5) as pfmd
FROM account_info;
无关,但 Postgres 下的最佳做法是使用类型 text
而不是 char
或 varchar
.
这是我的查询:
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 问题可能会弹出时。
提取子字符串的
LEFT
和RIGHT
函数可以像这样重新实现: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
截图证明:
Postgres functions left
和 right
期望他们的第一个参数是 text
。
因此,首先将 account_no
强制转换为 text
并且您的查询(有点简化)将起作用。
SELECT *,
right(account_no::text, 4) || right(customer_id, 5) as pfmd
FROM account_info;
无关,但 Postgres 下的最佳做法是使用类型 text
而不是 char
或 varchar
.