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