我正在使用 MySQL 并嘗試將 CONCAT_WS() 函式與 SELECT 一起使用。
我試過:
SELECT id, A_12, CONCAT_WS('A_', '12') as testA from TABLE_A
我期待像
id | A_12 | testA |
-------------------
1 | 20 | 20 |
該值testA應與 中的值相同A_12。
然而,我得到的是
id | A_12 | testA |
-------------------
1 | 20 | 12 |
testA 列中的“12”只是來自 CONCAT_WS() 函式的后一個字串CONCAT_WS('A_','12')。
任何幫助,將不勝感激。
======編輯======:
抱歉,我一開始沒有明確說明我的問題和目的。我有12列A_1, A_2, ... , A_12在TABLE_A。更具體地說,Table_A看起來像這樣:
id | A_1 | A_2 | ... | A_12|
---------------------------
1 | 4 | 5 | ... | 20 |
2 | 1 | 4 | ... | 50 |
3 | 2 | 5 | ... | 70 |
我還有另一個TABLE_B看起來像這樣的表:
id | value
----------
1 | 12
2 | 5
3 | 3
我正在嘗試創建一個存盤函式...
- 從中選擇相應
value的TABLE_B - from
TABLE_A, 拉取列下的資訊A_來自的值Table_B
for every id.
So I have
SELECT id, CONCAT_WS('A_', stored-value-from-TABLE_B) as testA from TABLE_A
To make sure if the code is running as I expect, I ran
SELECT id, A_12, CONCAT_WS('A_', '12') as testA from TABLE_A
since the value for id=1 in Table_B is 12.
However, what I'm getting is 12 in testA column for every id.
uj5u.com熱心網友回復:
好得到這個結果只需要
SELECT id, A_12, A_12 as testA from TABLE_A
uj5u.com熱心網友回復:
您似乎認為選擇串列必然是一個列名串列,因此像 CONCAT_WS() 這樣的字串函式會產生一個像這樣的字串,A_12并且該字串必須被解釋為列識別符號,因此該查詢的結果將使用由該字串命名的列的值。
但這不是 SQL 選擇串列的作業方式。
選擇串列是運算式串列。您可以使用簡單的列名,結果將是該列中的值。或者您可以使用另一個運算式,在這種情況下是一個字串函式,結果將是該函式回傳的字串——而不是巧合具有與該字串匹配的名稱的列。
正如上面的評論中提到的,識別符號在 SQL 查詢中是固定的。您不能創建字串運算式并將該運算式的值解釋為同一查詢中的識別符號。要對識別符號進行動態參考,您需要在準備查詢之前用SQL 語法對其進行格式化。
你也誤解了什么CONCAT_WS('A_', '12')。它連接它的第二個引數和更多的引數,它們之間有第一個引數的分隔符。一個典型的用法是:
CONCAT_WS(', ', col1, col2, col3, ...)`
這將從幾列的值中回傳以逗號分隔的單詞串列:“value1、value2、value3”。
因此,在您的情況下,您連接了單個值“12”,但未出現分隔符“A_”,因為串列中只有一個值。
uj5u.com熱心網友回復:
您可以在它們的ids上加入表,并A_?使用ELT()必須列舉所有 12 列的函式選擇正確的:
SELECT b.*,
ELT(b.value, a.A_1, a.A_2, ..., a.A_12) testA
FROM TABLE_B b INNER JOIN TABLE_A a
ON b.id = a.id;
查看一個簡化的演示。
uj5u.com熱心網友回復:
首先,你不想要CONCAT_WS(),你想要CONCAT()- 帶有分隔符的 Concat 在所有其他引數之間插入你的第一個引數,并且由于你只有一個其他引數,它永遠不會被使用 - 例如CONCAT_WS('A_', '12', '13')會給你12A_13. CONCAT('A_', '12')給你,A_12但作為一個字串,而不是一個列名。
在更正為 CONCAT 并評估后,您的選擇將如下所示SELECT id, A_12, 'A_12' as testA from TABLE_A;注意 A_12 周圍的引號。
這是因為 concat 函式回傳一個字串,并且不能以您想要的方式用于在選擇字串中構建列名。這樣做是可能的,但很復雜 - 您必須在字串變數中構建整個查詢字串,然后將其作為準備好的陳述句執行:
SET @QueryString = CONCAT('SELECT id, A_12, ', CONCAT('A_', '12'), ' as testA from TABLE_A;');
PREPARE stmnt FROM @QueryString;
EXECUTE stmnt;
嵌套CONCAT()是不必要的,因為 concat 可以接受任意數量的引數,因此您可以將其簡化為:
SET @QueryString = CONCAT('SELECT id, A_12, ', 'A_', '12', ' as testA from TABLE_A;');
PREPARE stmnt FROM @QueryString;
EXECUTE stmnt;
你的@QueryString 將是 SELECT id, A_12, A_12 as testA from TABLE_A;
如果該字串中的任何內容來自系統中的用戶輸入,則這可能非常危險。如果它連接到任何應用程式,請使用您的服務器端應用程式語言使用的任何連接組合字串,然后將其作為查詢執行。
DB Fiddle 測驗(SQLFiddle 似乎已經取消了對準備好的陳述句中選擇的支持)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315214.html
