【问题标题】:Case when and coalesce is not working with openquerycase when and coalesce 不适用于 openquery
【发布时间】:2022-01-14 00:43:13
【问题描述】:
select * from openquery(servername,'select vndr_num as VendorNum,t1,t2,t3,
case when trim(t1) is not null then t1
     when trim(t2) is not null then t2
     else t3
end as TAX,
coalesce(t1,t2,t3) as TID
from Mck.table_name')

我希望当 t1 为空白时,应将 t2/t3 列中的数据复制到 TAx 和 TID 列,但在 coalesce 函数的情况下,结果是相同的。如果 case when 和 coalesce 无法做到这一点,请提出任何其他选项。

Vnum t1       t2        t3       Tax            TID
1                   
2                   
3               86-0378223          
4               95-2743174          
5               81-3997819          
6   532-98-0158                  532-98-0158    532-98-0158
7               82-2010249          
8               46-2037641          
9               32-0119411          

【问题讨论】:

  • 如果你直接在目标服务器上执行查询,而不是通过openquery,你会得到所需的结果吗?
  • 我只想要 openquery 所需的结果,因为我正在从该服务器连接到多个服务器。我怀疑 t1 列中有一些隐藏值,因为合并函数没有向前读取 t2/t3 值。如果是这种情况,我们可以用修剪删除那些隐藏的值吗?

标签: sql sql-server tsql


【解决方案1】:

在 SQL Server、标准 SQL 和几乎所有 DBMS 中,字符串可以为 NULL 或空,这是两个不同的东西。这是一个对我们人类来说并不直观的概念。如果我们有一个带有供应商地址列的供应商表,我们要么知道地址并将其放在那里,要么我们不知道地址并将其留空。但哪个“空”?我们必须在 NULL 和空字符串 '' 之间做出选择。

您必须决定使用哪个空,因为它们的行为不同。我想我们最常使用 NULL 并应用检查约束来阻止我们写入空字符串。 (如果我们进一步遵循这条路线,我们甚至可以应用一个检查约束,只允许不包含空格的字符串,使其为 NULL 或包含至少一个可读字符。)

在您的情况下,空字符串列可以是从 NULL''' ' 到一些冗长的 ' ' 的任何内容。如果我们只将空白字符视为可能的空格,那么您只想查看修剪时长度大于零的字符串:

select 
vndr_num as vendornum, t1, t2, t3,
case when len(trim(t1)) > 0 then t1
     when len(trim(t2)) > 0 then t2
     else t3
end as tax
from mck.table_name;

(如果可以有其他空白,您必须在 TRIM 函数中说明这一点。在 stackexchange/.../trim-whitespace... 我发现了这个:TRIM( NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A) FROM t1))。

【讨论】:

  • 这很好用。当我将来自 SQL 服务器的 SAP HANA 与 openquery 连接时,必须使用长度而不是 len。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2021-06-14
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多