如何连接行值以在T-SQL查询的WHERE子句中使用

时间:2010-09-22 20:10:59

标签: sql sql-server tsql concatenation

我想在T-SQL中编写一个查询来对两个连接列执行搜索。这两列是fname和lname。以下是我到目前为止的情况:

SELECT
    fname,
    lname,
    ...
FROM
    users
JOIN
    othertable ON foo=bar
WHERE
    fname+' '+lname LIKE '%query%'
但是,

SQL服务器不喜欢这种语法。我如何构造查询,以便我可以执行搜索两个连接列的WHERE LIKE操作,允许我搜索用户的全名,而不是单独搜索名字和姓氏?

3 个答案:

答案 0 :(得分:5)

我只能建议fname或lname中的一个为NULL,因此LIKE失败。(NULL concat any is null)

尝试

...
ISNULL(fname, '') + ' ' + ISNULL(lname, '') LIKE '%query%'

但是,我会使用computed column并考虑将其编入索引,因为这会运行得非常糟糕。

答案 1 :(得分:4)

我的建议是在表中为full_name添加一个计算列 计算列示例:

--drop table #test
create table #test (test varchar (10) , test2 varchar (5),[Calc]  AS right(test, 3))
Insert #test
values('hello', 'Bye')
Insert #test
values('hello-bye', null)


Alter table #test
add [MyComputedColumn]  AS substring(test,charindex('-',test), len(test)),
Concatenatedcolum as test+ ' ' +test2
select * from #test

正如你所看到的,你可能需要玩一下才能得到你想要的结果。首先在临时表中执行此操作,以避免必须多次重构数据库表。对于名称,特别是如果您使用通常为空的中间名,您可能需要添加一些代码来处理空值。您可能还需要有时代码转换为相同的数据类型,如果您连接的文件是例如int而另一个是varchar。

答案 2 :(得分:0)

我认为其中一个连接条件可能会导致问题。尝试重写它,你可能会发现错误消失;)