可以:在oracle中连接表时将char强制转换为varchar

可以:在oracle中连接表时将char强制转换为varchar,oracle,join,casting,Oracle,Join,Casting,我可以在A1varchar2(2)上加入B1char(2): 它不会导致任何错误,但不会显示任何数据 上述查询是否可行 你可以投下它,但它并没有像你想的那样投下,也不像你看起来依赖的那样投下。假设在要加入的字段中有一个字符值,则无论是否有演员阵容,都无法获得匹配: create table a (a1 varchar2(2)); create table b (b1 char(2)); insert into a values ('X'); insert into b values ('X')

我可以在
A1
varchar2(2)
上加入
B1
char(2)

它不会导致任何错误,但不会显示任何数据


上述查询是否可行

你可以投下它,但它并没有像你想的那样投下,也不像你看起来依赖的那样投下。假设在要加入的字段中有一个字符值,则无论是否有演员阵容,都无法获得匹配:

create table a (a1 varchar2(2));
create table b (b1 char(2));

insert into a values ('X');
insert into b values ('X');

select * from a left join b on b.b1 = a.a1;

A1 B1
-- --
X     

select * from a left join b on cast(b.b1 as varchar2(2)) = a.a1;

A1 B1
-- --
X     
强制转换正在更改数据类型,但不更改数据;它仍然是空白的。唯一的区别是它是在值中显式完成的,而不是像您在
char
中看到的那样隐式完成的。您可以使用
dump()
函数验证该值是否相同:

select dump(b.b1) dump_char,
  dump(cast(b.b1 as varchar2(2))) dump_varchar2
from b;

DUMP_CHAR            DUMP_VARCHAR2      
-------------------- --------------------
Typ=96 Len=2: 88,32  Typ=1 Len=2: 88,32   
因此,类型已更改,从96(
char
)更改为1(
varchar2
),但值相同。将其与表A中的值进行比较,您会发现它们不同:

select dump(a.a1) dump_varchar2 from a;

DUMP_VARCHAR2      
--------------------
Typ=1 Len=1: 88      
您的强制转换B值仍有尾随空格,而A值没有尾随空格,因此它们不匹配。您可以删除该尾随空格,以便与
trim()
rtrim()
进行比较:

rtrim()
调用中有一个从
char
varchar2
的隐式转换,因此为了清晰起见,您仍然可以显式地强制转换它

请注意,这假设在a中从未有尾随空格。以另一种方式强制转换可能更安全:

select * from a left join b on b.b1 = cast(a.a1 as char(2));

A1 B1
-- --
X  X  

。。。但是你投/修剪的哪一边也会影响到可以使用哪些索引。

你可以投,但它并没有像你想象的那样,或者看起来依赖的那样。假设在要加入的字段中有一个字符值,则无论是否有演员阵容,都无法获得匹配:

create table a (a1 varchar2(2));
create table b (b1 char(2));

insert into a values ('X');
insert into b values ('X');

select * from a left join b on b.b1 = a.a1;

A1 B1
-- --
X     

select * from a left join b on cast(b.b1 as varchar2(2)) = a.a1;

A1 B1
-- --
X     
强制转换正在更改数据类型,但不更改数据;它仍然是空白的。唯一的区别是它是在值中显式完成的,而不是像您在
char
中看到的那样隐式完成的。您可以使用
dump()
函数验证该值是否相同:

select dump(b.b1) dump_char,
  dump(cast(b.b1 as varchar2(2))) dump_varchar2
from b;

DUMP_CHAR            DUMP_VARCHAR2      
-------------------- --------------------
Typ=96 Len=2: 88,32  Typ=1 Len=2: 88,32   
因此,类型已更改,从96(
char
)更改为1(
varchar2
),但值相同。将其与表A中的值进行比较,您会发现它们不同:

select dump(a.a1) dump_varchar2 from a;

DUMP_VARCHAR2      
--------------------
Typ=1 Len=1: 88      
您的强制转换B值仍有尾随空格,而A值没有尾随空格,因此它们不匹配。您可以删除该尾随空格,以便与
trim()
rtrim()
进行比较:

rtrim()
调用中有一个从
char
varchar2
的隐式转换,因此为了清晰起见,您仍然可以显式地强制转换它

请注意,这假设在a中从未有尾随空格。以另一种方式强制转换可能更安全:

select * from a left join b on b.b1 = cast(a.a1 as char(2));

A1 B1
-- --
X  X  
。。。但是你投/修剪的哪一面也会影响哪些索引可以使用。

这对我来说很有用:

SELECT * FROM A 
  LEFT JOIN B 
    ON TRIM(B.B1) = A.A1
与演员阵容相比,我更喜欢这种语法,这纯粹是出于美学原因,尽管可能还有其他的语法存在

这对我很有用:

SELECT * FROM A 
  LEFT JOIN B 
    ON TRIM(B.B1) = A.A1
与演员阵容相比,我更喜欢这种语法,这纯粹是出于美学原因,尽管可能还有其他原因