在TypeORM查询构建器上比较uuid和字符串

时间:2020-01-03 21:37:29

标签: node.js postgresql typescript nestjs typeorm

我想加入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;
          });

2 个答案:

答案 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);