sql >> Databáze >  >> RDS >> Mysql

Jak porovnat dvě pole/sloupce v podmínce?

Kdykoli narazíte na problémy s dotazem, zkontrolujte, jaké dotazy se skutečně generují (například pomocí DebugKit ). Pokud se nejedná o objekt výrazu, pravá strana podmínky bude vždy vázána jako parametr, tj. porovnáváte s řetězcovým literálem:

Pupils.school_id = 'Schools.id'

Obecně platí, že pro správnou kompatibilitu automatických citací by názvy sloupců měly být výrazy identifikátoru. Zatímco s levou stranou bude automaticky správně zacházeno, s pravou stranou bude nutné manipulovat ručně.

Ve vašem konkrétním případě můžete snadno použít QueryExpression::equalFields() , což je přesně to, co se snažíte udělat, porovnání polí/sloupců:

->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
    return $exp->equalFields('Pupils.school_id', 'Schools.id');
})

Je také možné vytvořit výrazy identifikátorů ručně tím, že je jednoduše vytvoříte:

->where([
    'Pupils.school_id' => new \Cake\Database\Expression\IdentifierExpression('Schools.id')
])

nebo od CakePHP 3.6 prostřednictvím Query::identifier() metoda:

->where([
    'Pupils.school_id' => $query->identifier('Schools.id')
])

A nakonec můžete také vždy předat hodnotu jednoho řetězce, která se v zásadě vloží do dotazu jako nezpracovaný SQL, ale v takovém případě nebudou identifikátory podléhat automatickému citování identifikátorů:

->where([
    'Pupils.school_id = Schools.id'
])

Viz také




  1. Chcete-li ignorovat duplicitní klíče během „kopírování z“ v postgresql

  2. SQL Server Vysvětlení NĚKTERÉHO operátora

  3. čtení/zápis unicode dat v MySql

  4. Odeberte podivné znaky (A s kloboukem) ze sloupce varchar serveru SQL Server