从SQL表中选择并连接两个字符串列

时间:2016-07-19 07:34:33

标签: sql-server stored-procedures

问题

我想编写一个查询,它将从一个表中选择所有字符串值等于两列连接在一起的表。

这是简单的英文版本:

@MYSTRING varchar(50)

SELECT ALL FROM [FFLOCNP] WHERE COLUMN1 + COLUMN2 = @MYSTRING

我曾尝试过使用COALESCE,但之前我从未使用过它,它给我一个错误:

@CODE varchar(50)

SELECT * FROM [dbo].[FFLOCNP] WHERE COALESCE([LOCTRY], '') || COALESCE([LOCLCN], '') = @CODE

2 个答案:

答案 0 :(得分:0)

你必须使用ISNULL。 使用以下查询可能会对您有所帮助。

SELECT * FROM [FFLOCNP] WHERE ISNULL(COLUMN1,'') + ISNULL(COLUMN2,'') = @MYSTRING

答案 1 :(得分:0)

使用ISNULL而不是COALESCE时要小心。 ISNULL将返回值限制为第一个输入参数的数据类型。在给定的示例中,列V1将使用nvarchar(1)隐式定义,因为列V1中的最长文本仅包含一个字符。 ISNULL(V1,[param2])将始终返回一个字符长的字符串,无论第二个参数的长度如何。在你的情况下,如果你想用空字符串替换NULL,ISNULL会工作。如果你想用更长的字符串替换NULL,那么你必须使用COALESCE而不是ISNULL。无论参数1的数据类型如何,COALESCE都返回参数2中的完整字符串。除此之外,COALESCE是标准SQL,而ISNULL是SQL-Server的一种风格。标准SQL应优先于T-SQL风格,以获得更多可移植代码。

WITH CTE_SRC AS
(
   SELECT
       [V1]
      ,[V2]
   FROM
      (VALUES  
          (N'A', N'BB')
         ,(NULL, N'BB')
         ,(N'A', NULL)
      ) T([V1],[V2])
)
SELECT 
    ISNULL([V1], '1234')  AS [ISNULL]
   ,COALESCE([V1], '123') AS [COALESCE] 
FROM 
   CTE_SRC

Result

ISNULL COALESCE
------ --------
A      A
1      123
A      A