Sql-Server

已編輯欄位上的 SQL 連接

  • February 23, 2022

我正在嘗試在 Url 欄位中加入 Table1 和 Table2。但是,Table2 中的所有 Url 都以“/”結尾,如下例所示:

表格1

╔═════════════════════╗
║ Url1                ║
╠═════════════════════╣
║ http://site1.com    ║
║ http://site2.com    ║
║ http://site3.com    ║
║ http://site4.com    ║
║ http://site5.com    ║
╚═════════════════════╝

表2

╔═════════════════════╗
║ Url2                ║
╠═════════════════════╣
║ http://site1.com/   ║
║ http://site2.com/   ║
║ http://site3.com/   ║
║ http://site4.com/   ║
║ http://site5.com/   ║
╚═════════════════════╝

我正在使用 SUBSTRING 從 Url2 欄位中刪除最後一個字元。這是我的查詢的樣子:

SELECT Table1.Url1,
      SUBSTRING(Table2.Url2, 1, LEN(Table2.Url2) - 1) AS Urlx
FROM Table2
LEFT JOIN Table1 ON Urlx = Table1.Url1

但是我無法解析 LEFT JOIN 子句中的Urlx欄位。

是否可以在操作欄位上連接表,或者我是否錯誤地建構了我的查詢?

將子字元串條件移動到連接子句並註意我添加了另一條記錄http://site6.com用於測試目的

SELECT tbl1.Url1,
      tbl2.Url2
FROM tbl1
LEFT JOIN tbl2 ON   SUBSTRING(tbl2.Url2, 1, LEN(tbl2.Url2) - 1) = tbl1.Url1

結果:

   Url1                  Url2
http://site1.com  http://site1.com/
http://site2.com  http://site2.com/
http://site3.com  http://site3.com/
http://site4.com  http://site4.com/
http://site5.com  http://site5.com/
http://site6.com

展示

在這種情況下,您需要將該函式放在 WHERE 子句中。這不是一個好的做法,因為該函式需要在檢查是否相等之前在表中的每一行上執行。更好的方法是在插入時正確格式化數據,以便兩個表已經具有相等的值。

但是,如果這不是一個選項,並且您必須執行此查詢,我建議您使用這種方法。

嘗試TRIM在 WHERE 子句中使用函式而不是 SUBSTRING。SUBSTRING 將始終刪除最後一個字元(或指定的任何位置)。當“/”並不總是字元串的尾隨字元時,問題就會出現。在這種情況下,您將修剪一個有效的 URL 字元。

試試這個查詢。

SELECT tbl1.Url1,
   tbl2.Url2
FROM tbl1
LEFT JOIN tbl2 ON TRIM('/' FROM tbl2.Url2) = tbl1.Url1

注意:該TRIM功能僅適用於 SQL Server 2017 及更高版本。

小提琴

TRIM 文件和語法

引用自:https://dba.stackexchange.com/questions/307171