Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL将nchar与字符串进行比较_Sql_Sql Server_Tsql - Fatal编程技术网

SQL将nchar与字符串进行比较

SQL将nchar与字符串进行比较,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个专栏: 身份证(nchar) 名称(varchar) 简单的事情就是搞不懂怎么做 select * from plant.carrier where carrier_id like 'NT' 这会导致表达式错误 SELECT * FROM plant.carrier WHERE RTrim(CAST([carrier_id] As VarChar) = 'NT' id列 CREATE TABLE [plant].[car

我有两个专栏:

  • 身份证(nchar)
  • 名称(varchar)
简单的事情就是搞不懂怎么做

    select *
    from plant.carrier
    where carrier_id like 'NT'
这会导致表达式错误

      SELECT *
      FROM plant.carrier
      WHERE RTrim(CAST([carrier_id] As VarChar) = 'NT'
id列

CREATE TABLE [plant].[carrier](
    [carrier_id] [nchar](4) NOT NULL,
    [name] [nvarchar](30) NOT NULL,
 CONSTRAINT [PK_carrier] PRIMARY KEY CLUSTERED 
(
    [carrier_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS =enter code here ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO


要比较nchar和varchar,需要将char转换为varchar并比较两个varchar:

RTrim(CAST([nCharColumn] As VarChar)
已更新

以下是完整的示例:

create table test (
f nchar(20))

insert into test values('nt')
insert into test values('st')

declare @s varchar(20) = 'nt'
select * from test where rtrim(cast(f as varchar)) = @s
更新2

CREATE TABLE [carrier](
    [carrier_id] [nchar](4) NOT NULL,
    [name] [nvarchar](30) NOT NULL,
 CONSTRAINT [PK_carrier] PRIMARY KEY CLUSTERED 
(
    [carrier_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

insert into carrier values('nt', 'nt')
insert into carrier values('st', 'st')

declare @s varchar(20) = 'nt'
select * from carrier where rtrim(cast([carrier_id] as varchar)) = @s

这对我来说也很好。它返回一条记录。

要比较nchar和varchar,需要将char转换为varchar并比较两个varchar:

RTrim(CAST([nCharColumn] As VarChar)
已更新

以下是完整的示例:

create table test (
f nchar(20))

insert into test values('nt')
insert into test values('st')

declare @s varchar(20) = 'nt'
select * from test where rtrim(cast(f as varchar)) = @s
更新2

CREATE TABLE [carrier](
    [carrier_id] [nchar](4) NOT NULL,
    [name] [nvarchar](30) NOT NULL,
 CONSTRAINT [PK_carrier] PRIMARY KEY CLUSTERED 
(
    [carrier_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

insert into carrier values('nt', 'nt')
insert into carrier values('st', 'st')

declare @s varchar(20) = 'nt'
select * from carrier where rtrim(cast([carrier_id] as varchar)) = @s
这对我来说也很好。它返回一条记录。

如果您这样做,您将看到
[var]char
n[var]char
之间的转换是隐式的,因此可以这样说

where x.some_char_column = y.some_nchar_column
应该可以正常工作…除非列在其定义的排序规则中有所不同。那你可能会有问题

如果您这样做,您将看到
[var]char
n[var]char
之间的转换是隐式的,所以可以这样说

where x.some_char_column = y.some_nchar_column
应该可以正常工作…除非列在其定义的排序规则中有所不同。那你可能会有问题


比较字符串值时不要使用rtrim。无论数据类型是(n)char还是(n)varchar,sql server都将忽略任何字符串右侧的空格以进行相等性检查

这些对你的原作的轻微修改中的任何一个都可以正常工作。它们都与您的已发布表一起工作

select *
from carrier
where carrier_id like 'NT%'

SELECT *
FROM carrier
WHERE [carrier_id] = 'NT'

比较字符串值时不要使用rtrim。无论数据类型是(n)char还是(n)varchar,sql server都将忽略任何字符串右侧的空格以进行相等性检查

这些对你的原作的轻微修改中的任何一个都可以正常工作。它们都与您的已发布表一起工作

select *
from carrier
where carrier_id like 'NT%'

SELECT *
FROM carrier
WHERE [carrier_id] = 'NT'

你试过了吗?你的问题是什么?我试过cast(id为text)没有工作,systax是正确的,但仍然没有返回任何内容,尽管那里的数据是nchar。我有一个nchar NT,当我使用它时,我无法得到它。你知道你需要将它与什么数据类型进行比较,那你为什么要用
Text
来代替呢?你试过了吗?你的问题是什么?我试过cast(id为Text)没有用,systax是正确的,但尽管有nchar数据,但仍然没有返回任何内容。我有一个nchar NT,当我使用它时,我无法得到它。你知道你需要将它与什么数据类型进行比较,那么,为什么要使用
文本
呢?不妨把它放在这里,因为OP现在不太可能阅读它,如果他们还没有:
隐式转换对用户不可见。SQL Server会自动将数据从一种数据类型转换为另一种数据类型。例如,当将smallint与int进行比较时,smallint会在比较进行之前隐式转换为int。
请注意,在不同类型的字符串(一列为nvarchar,另一列为varchar)之间的WHERE或JOIN子句中进行比较会在SQL Server中引入一些非常糟糕的性能问题。我的意思是,非常严重的性能问题。只要有可能,就应该消除这种字符串类型不匹配。@pmbAustin:无论转换是显式的还是隐式的,这都是真的。如果要与字符串文字表达式或常量表达式进行比较(如O.P.的问题陈述中所述),则优化器可能是—或者,至少应该是—足够聪明,可以提前进行转换,避免转换问题。但是,完全有可能不是这样。不妨把这个放进去,因为OP现在不太可能读取它,如果他们还没有:
隐式转换对用户不可见。SQL Server会自动将数据从一种数据类型转换为另一种数据类型。例如,当将smallint与int进行比较时,smallint会在比较进行之前隐式转换为int。
请注意,在不同类型的字符串(一列为nvarchar,另一列为varchar)之间的WHERE或JOIN子句中进行比较会在SQL Server中引入一些非常糟糕的性能问题。我的意思是,非常严重的性能问题。只要有可能,就应该消除这种字符串类型不匹配。@pmbAustin:无论转换是显式的还是隐式的,这都是真的。如果要与字符串文字表达式或常量表达式进行比较(如O.P.的问题陈述中所述),则优化器可能是—或者,至少应该是—足够聪明,可以提前进行转换,避免转换问题。但这完全有可能,不是的。不管什么原因,空格都在左边,所以我使用了ltrim。哦…希望你的表不会像这个不可争论的表那么大,并且你在该列上的任何索引都将不可用。空格在左边,不管什么原因,所以我使用了ltrim。哦…希望你的表不会像这个不可争论的表那么大,也没有你需要的任何索引那一栏上的数字将无法使用。