Sql 如何使用Join with like运算符,然后使用强制转换列

Sql 如何使用Join with like运算符,然后使用强制转换列,sql,sql-server,tsql,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语句。请提供有关您的表格的更多信息。您必须将其中一个电话

我有两个包含以下列的表:

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

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

不能在联接条件中使用LIKE语句。请提供有关您的表格的更多信息。您必须将其中一个电话字段的格式转换为与其他电话字段格式一起编译才能加入

我认为您的
加入
条件顺序不对。因为您的问题明确提到了两个表,所以让我们继续使用它们:

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

自从我处理
文本
数据类型(在SQL Server中)已经很久了,我不记得是否需要
cast()

与其尝试在一个顶级查询中完成所有操作,不如对
订单
表应用转换投影,并将其用作子查询,这将使查询更容易理解

使用
CHARINDEX
函数将使这一点变得更容易,但是它不支持
ntext
,您需要将模式更改为使用
nvarchar(max)
——您无论如何都应该这样做,因为
ntext
已被弃用,幸运的是您可以使用
CONVERT(nvarchar(max),sometextvalue)
,虽然这会降低性能,因为您将无法在
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
然后您可以这样使用它:

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

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

这个问题并不清楚。请包含联接中涉及的两个表中的示例数据。使用
ntext
会带来困难,因为并非每个文本处理函数都支持它
ntext
已被弃用,您仍应使用
nvarchar(max)
。您是否可以将表架构更改为使用
nvarchar(max)
?如果有两个表,为什么查询包含三个?这是错误的<当然,code>LIKE可以用作
JOIN
条件。我不能更改模式中的ntext数据类型,因为它在数据库中。有没有任何方法可以使用ntext,我可以得到结果/@PSri包装
ntext
列在
CONVERT(nvarchar(max),value)
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