如何使用与like运算符连接然后转换列

时间:2017-02-10 01:22:21

标签: sql sql-server tsql

我有两个包含这些列的表:

CREATE TABLE #temp 
(
    Phone_number varchar(100) -- example data: "2022033456"
)

CREATE TABLE orders 
(
    Addons ntext -- example data: "Enter phone:2022033456<br>Thephoneisvalid"
)

我必须使用'LIKE'加入这两个表,因为电话号码的格式不同。小背景我加入电话号码上的#temp表,其Addons值为orders表。然后在WHERE条件下我试图匹配它们并获得一些结果。这是我的代码。但我得到的结果并不准确。由于它没有返回任何数据。我不知道我做错了什么。我正在使用SQL Server。

select
    * 
from
    order_no as n
join 
    orders as o on n.order_no = o.order_no
join
    #temp as t on t.phone_number like '%'+ cast(o.Addons as     varchar(max))+'%'
where
    t.phone_number = '%' + cast(o.Addons as varchar(max)) + '%'

3 个答案:

答案 0 :(得分:0)

您无法在JOIN条件中使用LIKE语句。请提供有关您的牌桌的更多信息。您必须将其中一个电话字段的格式转换为使用其他电话字段格式进行编译才能加入。

答案 1 :(得分:0)

我认为您的join条件的顺序错误。因为你的问题明确提到了两个表,所以我们坚持下去:

select * 
from orders o JOIN
      #temp t
      on  cast(o.Addons as varchar(max)) like '%' + t.phone_number + '%';

我处理text数据类型(在SQL Server中)已经很久了,我不记得cast()是否有必要。

答案 2 :(得分:0)

您应该将转换投影应用于orders表,并将其用作子查询,而不是尝试在单个顶级查询中执行所有操作,这将使查询更易于理解。

使用CHARINDEX功能会使这更容易,但不支持ntext,您需要更改架构以使用nvarchar(max) - 您应该这样做无论如何,ntext已被弃用,幸运的是您可以使用CONVERT( nvarchar(max), someNTextValue ),但这会降低性能,因为您无法在ntext值上使用任何索引 - 但此查询将运行无论如何,慢慢地。

SELECT
    orders2.*,
    CASE WHEN orders2.PhoneStart > 0 AND orders2.PhoneEnd > 0 THEN
        SUBSTRING( orders2.Addons, orders2.PhoneStart, orders2.PhoneEnd - orders2.PhoneStart )
    ELSE
        NULL
    END AS ExtractedPhoneNumber
FROM
    (
        SELECT
            orders.*, -- never use `*` in production, so replace this with the actual columns in your orders table
            CHARINDEX('Enter phone:', Addons) AS PhoneStart,
            CHARINDEX('<br>Thephoneisvalid', AddOns, CHARINDEX('Enter phone:', Addons) ) AS PhoneEnd
        FROM
            orders
    ) AS orders2

我建议将上述内容转换为VIEWCTE,以便您可以在JOIN表达式中直接查询:

CREATE VIEW ordersWithPhoneNumbers AS
    -- copy and paste the above query here, then execute the batch to create the view, you only need to do this once.

然后你可以像这样使用它:

SELECT
    * -- again, avoid the use of the star selector in production use
FROM
    ordersWithPhoneNumbers AS o2 -- this is the above query as a VIEW
    INNER JOIN order_no ON o2.order_no = order_no.order_no
    INNER JOIN #temp AS t ON o2.ExtractedPhoneNumber = t.phone_number

实际上,我收回了之前关于效果的评论 - 如果您在ExtractedPhoneNumber视图的ordersWithPhoneNumbers列中添加索引,那么您将获得良好的效果。