Sql 联接类型(内部、左侧)和数据类型转换影响查询计划和操作顺序

Sql 联接类型(内部、左侧)和数据类型转换影响查询计划和操作顺序,sql,left-join,inner-join,common-table-expression,snowflake-cloud-data-platform,Sql,Left Join,Inner Join,Common Table Expression,Snowflake Cloud Data Platform,返回:3行 将联接类型更改为内部会导致错误:数值“”无法识别。而不是::int我最终使用了try\u to\u number()函数,但需要一点尝试和错误才能弄清楚(上面的查询被简化了,我的查询更复杂) 这是一个bug,还是我做了一些奇怪的事情?数据库不能保证表达式的求值顺序。在某些数据库中,您的代码始终有效。在其他情况下,它可能有时有效,有时失败 这是虫子吗?我认为这是一个bug,但显然有些数据库供应商没有。你已经找到了工作。另一种方法是case表达式: create or replace t

返回:
3行

将联接类型更改为
内部
会导致错误:
数值“”无法识别
。而不是
::int
我最终使用了
try\u to\u number()
函数,但需要一点尝试和错误才能弄清楚(上面的查询被简化了,我的查询更复杂)


这是一个bug,还是我做了一些奇怪的事情?

数据库不能保证表达式的求值顺序。在某些数据库中,您的代码始终有效。在其他情况下,它可能有时有效,有时失败

这是虫子吗?我认为这是一个bug,但显然有些数据库供应商没有。你已经找到了工作。另一种方法是
case
表达式:

create or replace table test.bugs.table_one as (
  select *, random(1337) as cost
  from (
    values 
      ('', '2010-01-01', 'one')
      , ('10', '2010-01-01', 'two')
      , ('11', '2010-01-01', 'three')
      , ('12', '2010-01-01', 'four')
    )
);

create or replace table test.bugs.table_two as (
  select *, random(1337) as budget
  from (
    values 
      (9, '2010-01-01', 'one')
      , (10, '2010-01-01', 'two')
    )
);

with 
  t1 as (
    select 
      column1::int as column1
      , column2
      , column3
      , cost
    from table_one
    where column1 !=''
  ),
  t2 as (
    select
      column1
      , column2
      , column3
      , budget
    from table_two
  )
select *
from t1
inner join t2
  on t1.column1 = t2.column1
  and t1.column2 = t2.column2
  and t1.column3 = t2.column3;

这应该是可行的,因为
case
应该保证其参数的求值顺序。

数据库不保证表达式的求值顺序。在某些数据库中,您的代码始终有效。在其他情况下,它可能有时有效,有时失败

这是虫子吗?我认为这是一个bug,但显然有些数据库供应商没有。你已经找到了工作。另一种方法是
case
表达式:

create or replace table test.bugs.table_one as (
  select *, random(1337) as cost
  from (
    values 
      ('', '2010-01-01', 'one')
      , ('10', '2010-01-01', 'two')
      , ('11', '2010-01-01', 'three')
      , ('12', '2010-01-01', 'four')
    )
);

create or replace table test.bugs.table_two as (
  select *, random(1337) as budget
  from (
    values 
      (9, '2010-01-01', 'one')
      , (10, '2010-01-01', 'two')
    )
);

with 
  t1 as (
    select 
      column1::int as column1
      , column2
      , column3
      , cost
    from table_one
    where column1 !=''
  ),
  t2 as (
    select
      column1
      , column2
      , column3
      , budget
    from table_two
  )
select *
from t1
inner join t2
  on t1.column1 = t2.column1
  and t1.column2 = t2.column2
  and t1.column3 = t2.column3;

这应该是可行的,因为
case
应该保证其参数的求值顺序。

当连接时,因为内部连接在连接之前或之后所做的事情是相等的。所以像cast这样的东西可以被吊起来

WHERE
子句应在t1 CTE的SELECT部分之前求值

我刚刚用bug提交代码重新测试过,现在坏掉的案例可以工作了,但是工作案例(使用正确的TRY\u TO\u编号)失败了

我有一些像您这样的查询,它们都起作用了,然后在外部运行了一个额外的select层,并对结果进行了聚合,然后将cast提升回错误状态


但是是的,这是一个bug,所以我会报告它。

当连接时,因为内部连接在连接之前或之后所做的事情是相等的。所以像cast这样的东西可以被吊起来

WHERE
子句应在t1 CTE的SELECT部分之前求值

我刚刚用bug提交代码重新测试过,现在坏掉的案例可以工作了,但是工作案例(使用正确的TRY\u TO\u编号)失败了

我有一些像您这样的查询,它们都起作用了,然后在外部运行了一个额外的select层,并对结果进行了聚合,然后将cast提升回错误状态


但是,是的,这是一个bug,所以我会报告它。

不久前,他们将这一原始版本提交给Snowflake,他们同意这是错误的,但出于性能原因,希望保留它。我同意CASE是可行的,但最近不得不提交一个问题来进行合并,该问题实际上是同一类错误。不久前,他们向Snowflake提交了这个原始问题,他们同意这是错误的,但出于性能原因,希望保留该问题。我同意CASE是可行的,但最近不得不提交一个问题以进行合并,该问题实际上是同一类错误。
try\u cast(t1.column1为整数)
也在工作。
try\u cast(t1.column1为整数)
也在工作。