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,也许这会有所帮助。

SQL Fiddle

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] + '%')

Results

|      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

SQL Server:IF .. ELSE 中的 Where 子句

使用 SQL Server 2008 在 WHERE 子句中使用 SUBSTRING 函数 [重复]