【问题标题】:How to concatenate row values for use in WHERE clause of T-SQL query如何连接行值以用于 T-SQL 查询的 WHERE 子句
【发布时间】:2011-04-15 22:49:39
【问题描述】:

我想在 T-SQL 中编写一个查询来对两个连接的列执行搜索。两列是 fname 和 lname。这是我目前所拥有的:

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

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

【问题讨论】:

  • 你得到什么错误信息?
  • 我看不出有什么问题。有什么错误吗?
  • 我对我在 sql server 2005 上的联系人表执行了类似的查询,即使其中一列或两列中有 NULL 值,连接也不会导致问题。
  • @Adrift: 那么你有一个 deprecated 设置 CONCAT_NULL_YIELDS_NULL 设置或 DB 的兼容模式设置为 65 参见 MSDN msdn.microsoft.com/en-us/library/ms176056(SQL.90).aspx
  • 我得到了它的工作 - 我认为连接条件之一可能导致了问题。当我重写它时,错误消失了

标签: sql sql-server tsql concatenation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我的建议是在您的表中为 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,则有时您可能还需要将代码转换为相同的数据类型。

    【讨论】:

    • 你能给我指出一个关于如何添加计算列的好资源
    【解决方案3】:

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

    试试

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

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

    【讨论】:

    • 你能指出任何关于如何添加计算列的好资源吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多