sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:ERROR:operátor neexistuje:celé číslo =znak proměnný

Myslím, že to přesně říká, co je špatně. Nemůžete porovnávat celé číslo s varchar. PostgreSQL je přísný a nedělá za vás žádné magické přetypování. Hádám, že SQLServer provádí přetypování automaticky (což je špatná věc).

Pokud chcete porovnat tyto dvě různé bestie, budete si muset jednu na druhou přehodit pomocí syntaxe castingu :: .

Něco v tomto smyslu:

create view view1
as 
select table1.col1,table2.col1,table3.col3
from table1 
inner join
table2 
inner join 
table3
on 
table1.col4::varchar = table2.col5
/* Here col4 of table1 is of "integer" type and col5 of table2 is of type "varchar" */
/* ERROR: operator does not exist: integer = character varying */
....;

Všimněte si varchar typové obsazení na table1.col4.

Všimněte si také, že typové obsazení může způsobit, že váš index v tomto sloupci bude nepoužitelný a bude mít snížení výkonu, což je docela špatné. Ještě lepším řešením by bylo zjistit, zda můžete trvale změnit jeden ze dvou typů sloupců, aby odpovídal druhému. Doslova změňte návrh databáze.

Nebo můžete vytvořit index přetypovaných hodnot pomocí vlastního, neměnného funkce, která přenáší hodnoty na sloupec. Ale i to se může ukázat jako suboptimální (ale lepší než živé vysílání).




  1. Zkontrolujte, zda je objekt uloženou procedurou pomocí OBJECTPROPERTY() na serveru SQL Server

  2. Jak filtrovat řádky s hodnotami Null v příkazu Select v SQL Server - SQL Server / Výukový program TSQL, část 110

  3. Jak udělit všechna oprávnění uživateli root v MySQL 8.0

  4. Přidání ADO.NET Entity Data Model ve VS 2017 a nic se nestane