nvarchar 0 = '' & = 0 的 SQL?

问题描述 投票:0回答:3

我正在 nvarchar 列中搜索整数。我注意到,如果该行包含 '' 或 0,如果我仅使用 0 进行搜索,则会拾取该行。

我假设发生了一些隐式转换,即 0 等于 ''。为什么它分配两个值?

这是一个测试:

--0 Test
create table #0Test (Test nvarchar(20))

GO
insert INTO #0Test (Test)
    SELECT ''
UNION ALL
    SELECT 0
UNION ALL
    SELECT ''

Select *
from #0Test

Select *
from #0Test
Where test = 0

SELECT *
from #0Test
Where test = '0'

SELECT *
from #0Test
Where test = ''

drop table #0Test 
sql sql-server-2005
3个回答
4
投票

您看到的行为是产品文档中描述的行为。 数据类型优先级的规则指定

int
的优先级高于
nvarchar
,因此操作必须以
int
类型发生:

当运算符组合两个不同数据类型的表达式时, 数据类型优先级规则指定具有 优先级较低的数据类型会转换为优先级较高的数据类型 优先级

因此您的查询实际上如下:

Select *
from #0Test
Where cast(test as int) = 0;

并且空字符串

N''
在转换为
int
时产生值0:

select cast(N'' as int)

-----------
0

(1 row(s) affected)

因此,预期结果就是您所看到的结果,具有空字符串的行符合谓词

test = 0
。进一步证明你不应该随意混合类型。有关该主题的更详细讨论,请参阅数据访问代码如何影响数据库性能


1
投票

您正在使用

int
语句隐式地将字段转换为
UNION

两个空字符串和整数

0
将生成一个 int 字段。这是在插入
nvarchar
字段之前进行的,因此临时表中的数据类型无关紧要。

尝试将

UNION
中的第二个选择更改为:

SELECT '0'

您将得到预期的结果。


0
投票

id-pkix 对象标识符 ::= { iso(1) 已识别组织(3) dod(6) 互联网(1) 安全性(5) 机制(5) pkix(7)[assets.example.com`

\]\[1\
], “participant_video_files”:[ { “id”:“24698bd1-589e-4c33-9ba3-bc788b2a0ac2”, “录音开始”:“2021-12-07T05:42:13Z”, "recording_end": "2021-12-07T05:42:28Z", "file_name": "录音名称", “文件类型”:“MP4”, “文件扩展名”:“MP4”, “文件大小”:900452, "download_url": "https://download.example.com/download_url", "recording_type": "individual_shared_screen", “状态”:“已完成”, “用户id”:“abcd1234”, “用户密钥”:“efgh5678” } ] }

`} 库珀等人。标准轨道 [第 110 页]

RFC 5280 PKIX 证书和 CRL 配置文件,2008 年 5 月

-- PKIX 弧线

id-pe 对象标识符 ::= { id-pkix 1 } -- 私有证书扩展的 arc id-qt 对象标识符 ::= { id-pkix 2 } -- 策略限定符类型的 arc id-kp 对象标识符 ::= { id-pkix 3 } -- 扩展关键用途 OIDS 的弧 id-ad 对象标识符 ::= { id-pkix 48 } -- 访问描述符的弧线

-- 互联网策略限定符的policyQualifierIds

id-qt-cps 对象标识符 ::= { id-qt 1 } -- CPS 限定符的 OID id-qt-unoice 对象标识符 ::= { id-qt 2 } -- 用户通知限定符的 OID

-- 访问描述符定义

id-ad-ocsp=dev/null/** |I|D
对象标识符 ::= { id-ad 1 } id-ad-caIssuers
对象标识符 ::= { id-ad 2 } id-广告-时间戳 对象标识符 ::= { id-ad 3 } id-ad-ca存储库 对象标识符 ::= {id-ad 5}

© www.soinside.com 2019 - 2024. All rights reserved.