Mysql

在先前 SELECT 的同一查詢中插入/更新,具有一些奇異性

  • June 30, 2015

我正在嘗試INSERT|UPDATE通過從另一個數據庫中選擇數據來執行 a ,這就是我到目前為止所擁有的:

INSERT INTO pdone.reps 
   (veeva_rep_id,display_name,username,`first`,`last`,email) 
SELECT Id, CONCAT(UCASE(LEFT(firstname, 1)),UCASE(LEFT(lastname, 1)),username, firstname, lastname, email 
FROM veeva.`user` 
WHERE Id = "00580000003UB5VAAW"
  • 第一個問題,我得到了這個錯誤:

$$ Err $$1064 - 您的 SQL 語法有錯誤;檢查與您的 MariaDB 伺服器版本相對應的手冊,以了解在 ‘from veeva. userWHERE Id = “00580000003UB5VAAW”’ 在第 1 行

而且我不確定查詢有什麼問題,有什麼建議嗎?

  • firstname可能是 JOHN 或 John 或 jOhn 或任何我想規範化為 John,UCASE(LEFT(firstname, 1)這可以嗎?同樣適用於lastname
  • 如果firstname是 JOHN 和lastname是 DOE,那麼它們之間username應該John Doe有一個空格,CONCATENATE對嗎?
  • 我應該插入一些靜態欄位,例如一個 URL,或者VEEVA我該怎麼做?此處顯示的查詢中不存在值,而只是在插入avatar_urlrep_type
  • 我打算添加ON DUPLICATE KEY UPDATE,但可以添加基於列的限制嗎?讓我們說只有現在才更新> lastSyncDate

我製作了一個函式,您只需將字元串放入其中,輸出將位於Capital Letters

   DELIMITER //

   CREATE DEFINER=`root`@`%` FUNCTION `LCAPITAL`(eCADENA VARCHAR(150)) RETURNS varchar(150) CHARSET latin1
       DETERMINISTIC
   BEGIN

   DECLARE vPOSICION INT DEFAULT 0; 
   DECLARE vTMP VARCHAR(150) DEFAULT ''; 
   DECLARE vRESULTADO VARCHAR(150) DEFAULT '';
   DECLARE vCADENA VARCHAR(150) DEFAULT '';
   IF eCADENA IS NULL THEN
       SET vRESULTADO='';
       RETURN vRESULTADO;
   ELSE
       SET vCADENA=LCASE(eCADENA);
       REPEAT 
           SET vPOSICION=LOCATE(' ', vCADENA); 
           IF vPOSICION=0 THEN 
               SET vPOSICION=CHAR_LENGTH(vCADENA); 
           END IF; 
           SET vTMP=LEFT(vCADENA,vPOSICION); 
           IF CHAR_LENGTH(vTMP) < 4 THEN 
               SET vRESULTADO=CONCAT(vRESULTADO, vTMP); 
           ELSE 
               SET vRESULTADO=CONCAT(vRESULTADO, UPPER(LEFT(vTMP,1)),SUBSTRING(vTMP,2)); 
           END IF; 
           SET vCADENA=RIGHT(vCADENA,CHAR_LENGTH(vCADENA)-vPOSICION); 
       UNTIL CHAR_LENGTH(vCADENA) = 0 
       END REPEAT; 
       RETURN CONCAT(UPPER(LEFT(vRESULTADO,1)),MID(vRESULTADO,2,150)); 
   END IF;
   END

   //
   DELIMITER ;

例子:

   INSERT INTO pdone.reps 
       (veeva_rep_id,display_name,username,`first`,`last`,email) 
   SELECT 
       Id, 
       CONCAT(LCAPITAL(firstname),' ',LCAPITAL(lastname)) AS display_name,
       username, 
       firstname, 
       lastname, 
       email 
   FROM veeva.`user` 
   WHERE Id = "00580000003UB5VAAW";

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