SQL Server:在包含连接的where子句中使用LEN或变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:在包含连接的where子句中使用LEN或变量相关的知识,希望对你有一定的参考价值。
我创建了一个映射表,以在大量唯一主机名中查找各种唯一字符串。
如果我输入各种长度,即varchar(2)
,varchar(11)
等,初始代码有效。它试图引用变量长度是我的问题开始的地方。
在尝试使用变量之前,我尝试了几种不同的组合。
例如,在where子句中,用varchar(2)
替换m.[HostNameAlias_IDLength]
我也很难使用变量。
任何想法将不胜感激。
TM值
附:下面列出了代码和示例表的列表。
表格1
HostNameAlias_id
(pk,varchar(5),not null)ProjectName_ID
(int,not null)HostnameAlias_IDLength
(computed,int,null)
数据
HostNameAlias_ID ProjectName_ID HostNameAlias_IDLength
----------------------------------------------------------
H123456789023456 16009 16
B123456789023 16005 13
C1234567890 16009 11
d12345678 16009 9
e123456 16009 8
f12345 16003 6
g1234 16035 5
h123 16035 4
j12 16005 3
k1 16007 2
表2
- [
host name
](pk,nvarchar(50),not null Projectname_id
(int,not null)
样本数据:
Host name Title projectname_ID
--------------------------------------------------
C1234567890a1 vp 16009
C1234567890a2 avp 16009
h12335 student 16009
h12356 teacher 16009
h12357 prof 16009
询问
DECLARE @len = INT()
DECLARE @slen = VARCHAR(2);
SELECT DISTINCT
@len = m.[HostNameAlias_IDLength],
@slen = CONVERT(varchar(2), m.[HostNameAlias_ID]),
c.[Host Name],
m.[projectname_id]
FROM
[table1] c
JOIN
[table2] m ON c.[projectname_id] = m.[projectname_id]
WHERE
CONVERT(varchar(2), [Host Name]) IN (SELECT [HostNameAlias_ID]
FROM [table2])
在用于发现该长度的where子句中无法知道结果的长度,因此我无法确定您尝试此操作的原因。此外,[主机名]列是varchar(16),因此您最多可以遇到16个字符,因此只需使用该最大值...如果完全需要转换。
下面我刚刚使用LIKE而不是IN,也许这会有所帮助。
MS SQL Server 2014架构设置:
CREATE TABLE Table1
([HostNameAlias_ID] varchar(16), [ProjectName_ID] int, [HostNameAlias_IDLength] int)
;
INSERT INTO Table1
([HostNameAlias_ID], [ProjectName_ID], [HostNameAlias_IDLength])
VALUES
('H123456789023456', 16009, 16),
('B123456789023', 16005, 13),
('C1234567890', 16009, 11),
('d12345678', 16009, 9),
('e123456', 16009, 8),
('f12345', 16003, 6),
('g1234', 16035, 5),
('h123', 16035, 4),
('j12', 16005, 3),
('k1', 16007, 2)
;
CREATE TABLE Table2
([HostName] varchar(13), [Title] varchar(7), [projectname_ID] int)
;
INSERT INTO Table2
([HostName], [Title], [projectname_ID])
VALUES
('C1234567890a1', 'vp', 16009),
('C1234567890a2', 'avp', 16009),
('h12335', 'student', 16009),
('h12356', 'teacher', 16009),
('h12357', 'prof', 16009)
;
查询1:
SELECT
m.[HostName]
, c.[HostNameAlias_ID]
, m.[projectname_id]
, c.[HostNameAlias_IDLength]
FROM [table1] c
JOIN [table2] m ON c.[projectname_id] = m.[projectname_id]
WHERE [HostName] LIKE ([HostNameAlias_ID] + '%')
| HostName | HostNameAlias_ID | projectname_id | HostNameAlias_IDLength |
|---------------|------------------|----------------|------------------------|
| C1234567890a1 | C1234567890 | 16009 | 11 |
| C1234567890a2 | C1234567890 | 16009 | 11 |
re:[Host name]
包括列名中的空格是一个可以而且应该避免的并发症,所以我使用了[HostName]
。
以上是关于SQL Server:在包含连接的where子句中使用LEN或变量的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间
简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server
为啥当 WHERE 子句包含参数化值时 SQL Server 使用索引扫描而不是索引查找
where 子句中的 case 语句 - SQL Server