我想加入2个表,其中user.id = photo.userId,但是这里的问题是照片表上的userId是varchar,并且不能更改。所以我做了一个queryBuilder加入,问题在这里:
....
.where(user.id = photo.userId)
....
此查询抛出错误:运算符不存在:uuid =字符变化
有什么办法可以使这项工作成功吗?
注意:我的项目是使用TypeORM和Postgresql的NestJS API。
编辑 我已经有了Photo结果,并将其用于subQuery:
query = query
.where(qb => {
const subQuery = qb.subQuery()
.select('user.id')
.from(User, 'user')
.where('user.id = photo.userId)
.getQuery();
return 'EXISTS' + subQuery;
});
答案 0 :(得分:0)
https://www.postgresqltutorial.com/postgresql-cast/
where (user.id::VARCHAR = photo.userId)
答案 1 :(得分:0)
首先,在userId中将“ I”转换为“ i”(从上到下)完全是所期望的,因为标识符都使用小写,除非用双引号引起来。如果可能的话,请避免使用该标识符,因为每次使用时都必须使用双引号( )。
其次,uuid类型具有一些奇怪的和意外的格式设置规则。您可以按预期将字符串:: uuid与uuid进行比较,但是uuid :: text可能无法与srting比较。作为uuid :: text将格式化为hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh(其中h是十六进制数字)。如果以字符串形式存储,则破折号通常会被删除。因此,颠倒典型顺序;将字符串转换为uuid。请参见以下示例:
create table id_uuid (id uuid, col1 text);
create table id_str (id text, col1 text
insert into id_uuid(id, col1) values(gen_random_uuid(),'Id defined as uuid');
insert into id_str (id, col1)
select replace(id::text,'-',''),'Id defined as string'
from id_uuid;
select * from id_uuid;
select * from id_str;
select *
from id_uuid u
join id_str s
on (u.id::text = s.id);
select *
from id_uuid u
join id_str s
on (u.id = s.id::uuid);