Псевдоним где - PullRequest
       11

Псевдоним где

0 голосов
/ 12 ноября 2018

Я использую knex для запроса моего бэкэнда

knex('project AS p')
 .select('p.name as projectName')
 .where('p.name', 'abc')

Если я использую p.name = 'abc', тогда код работает

Однако я получаю ошибку при использовании:

.where(projectName, 'abc') 
.where(p.name, 'abc')
.where({projectName: abc})

Я хочу использовать псевдоним, чтобы запрашивать не имя p.name, потому что, когда клиент отправляет запрос, он отправляет? ProjectName = 'abc', а не 'p.name' = 'abc'. Вы знаете, как это сделать

Пример

SELECT 
    cp.id AS cId,
    (CASE WHEN cp.id = 7 THEN 'abc' ELSE 'NOT abc' END) AS abc
FROM customer_project AS cp
;

Как я запрашиваю, как это

SELECT 
    cp.id AS cId,
    (CASE WHEN cp.id = 7 THEN 'abc' ELSE 'NOT abc' END) AS abc
FROM customer_project AS cp
WHERE abc = 'abc'
;

Столбец с ошибкой abc не выходит. Но я действительно хочу сделать запрос к столбцу abc (хотя он не выходит из схемы, но я его создаю)

1 Ответ

0 голосов
/ 12 ноября 2018

Используйте .toSQL(), чтобы проверить, какие запросы knex генерирует в вашем случае.Ваши примеры в посте не работают (есть даже синтаксические ошибки), поэтому я не могу точно сказать, что вы делаете неправильно.

Однако это должно корректно работать и с knex:

> const Knex = require('knex');
undefined
> const knex = Knex({
...   client: 'pg',
... });
undefined
> 
> console.log(
... knex('project AS p')
...  .select('p.name as projectName')
...  .where('p.name', 'abc')
...  .where('projectName', 'abc')
...  .toSQL()
... );
{ method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ 'abc', 'abc' ],
  __knexQueryUid: 'c1a458e3-9fc4-4f9b-a206-eee7ecb5b897',
  sql: 'select "p"."name" as "projectName" from "project" as "p" where "p"."name" = ? and "projectName" = ?' }
undefined
> 

И мне кажется, что сгенерированный SQL выглядит просто отлично.

...