2015-12-22 3 views
0

J'ai une requête SQL pour extraire un nom de client de la base de données, créer un dossier client portant ce nom. Dans la requête, je tue des barres obliques et des points, et je change aussi tout résultat contenant MCDONALD pour SIMPLY "MCDONALDS". Donc MCDONALDS # 123 apparaît simplement comme MCDONALDS. Voici ma requête.Modifier la requête en requête SQL supérieure et inférieure SELECT

SELECT 
    CASE WHEN CHARINDEX('MCDONALD', cust_name) = 0 
     THEN REPLACE(REPLACE([cust_name],'.',''),'--','-') 
     ELSE 'MCDONALDS' 
    END cust_name 
FROM job,dbo.cust cust_name 
WHERE job.cust_id_bill_to = cust_name.cust_code AND 
job.job_id = '44321' AND 
job.sub_job_id = '2' 

Ainsi, les résultats sont maintenant:

MCDONALDS, 
BRISTOL-MYERS, 
TRUMP-CASINO 

résultats CONSIGNE est majuscules et minuscules dans chaque mot .. comme ceci:

Mcdonalds, 
Bristol-Myers, 
Trump-Casino 

Je sais que facile, mais pour moi sa comment le faire fonctionner AVEC le reste de ma requête, ce que j'essaie de ne pas travailler jusqu'à présent.

+0

'mysql' <>' Sql Server'. Choisissez-en un –

+0

Quels SGBD utilisez-vous? –

Répondre

0

Vérifier Nimit Dudani Réponse Here

DELIMITER $$ 

DROP FUNCTION IF EXISTS `test`.`initcap`$$ 

CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8 
BEGIN 
SET @str=''; 
SET @l_str=''; 
WHILE x REGEXP ' ' DO 
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str; 
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x; 
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str; 
END WHILE; 
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2))))); 
END$$ 

DELIMITER ; 

Utilisation:

select initcap ('Ceci est la chaîne de test');

+0

Merci, mais je ne suis pas familier avec la façon de déployer et d'appliquer cette réponse. Je suis juste à un niveau plus basique avec SQL et n'ai pas vu ou utilisé ce niveau de programmation lors du reformatage des résultats. Ainsi, quand j'exécute l'exemple de requête ici, il renvoie l'erreur. – JoePostscript

+0

ERREUR: syntaxe incorrecte près de '$'. Code d'erreur: 102 'CREATE FUNCTION' doit être la première instruction dans un lot de requêtes. – JoePostscript

+0

AUSSI, je remarque dans mon exemple de requête que j'avais deux ALORS, le second aurait dû dire ELSE. Pouvez-vous s'il vous plaît me montrer ou m'expliquer la mise en œuvre complète de votre réponse avec mon exemple de requête. TIA, je vous remercie pour votre temps précieux et Joyeux Noël à vous! – JoePostscript

0

Pour Sql Server, vous pouvez utiliser this

INITCAP Code de fonction définie par l'utilisateur

IF OBJECT_ID('dbo.InitCap') IS NOT NULL 
    DROP FUNCTION dbo.InitCap; 
    GO 

CREATE FUNCTION dbo.InitCap (@inStr VARCHAR(8000)) 
    RETURNS VARCHAR(8000) 
    AS 
    BEGIN 
    DECLARE @outStr VARCHAR(8000) = LOWER(@inStr), 
     @char CHAR(1), 
     @alphanum BIT = 0, 
     @len INT = LEN(@inStr), 
       @pos INT = 1;   

    -- Iterate through all characters in the input string 
    WHILE @pos <= @len BEGIN 

     -- Get the next character 
     SET @char = SUBSTRING(@inStr, @pos, 1); 

     -- If the position is first, or the previous characater is not alphanumeric 
     -- convert the current character to upper case 
     IF @pos = 1 OR @alphanum = 0 
     SET @outStr = STUFF(@outStr, @pos, 1, UPPER(@char)); 

     SET @pos = @pos + 1; 

     -- Define if the current character is non-alphanumeric 
     IF ASCII(@char) <= 47 OR (ASCII(@char) BETWEEN 58 AND 64) OR 
     (ASCII(@char) BETWEEN 91 AND 96) OR (ASCII(@char) BETWEEN 123 AND 126) 
     SET @alphanum = 0; 
     ELSE 
     SET @alphanum = 1; 

    END 

    RETURN @outStr;   
    END 
    GO 

Test:

SELECT dbo.InitCap('new york'); 

Résultat: New York,

Pour votre requête

SELECT 
    dbo.InitCap(CASE WHEN CHARINDEX('MCDONALD', cust_name) = 0 
        THEN REPLACE(REPLACE([cust_name],'.',''),'--','-') 
        THEN 'MCDONALDS' 
       END) cust_name 
FROM job,dbo.cust cust_name 
WHERE job.cust_id_bill_to = cust_name.cust_code AND 
job.job_id = '44321' AND 
job.sub_job_id = '2' 
+0

Merci, mais je ne suis pas familier avec la façon de déployer et d'appliquer cette réponse. Je suis juste à un niveau plus basique avec SQL et n'ai pas vu ou utilisé ce niveau de programmation lors du reformatage des résultats. Ainsi, quand j'exécute l'exemple de requête ici, il renvoie l'erreur. – JoePostscript

+0

ERREUR: Impossible de trouver la colonne "dbo" ou la fonction définie par l'utilisateur ou d'agréger "dbo.InitCap", ou le nom est ambigu. Code d'erreur: 4121 – JoePostscript

+0

Si j'ajoute votre syntaxe yout au-dessus de ma requête, il y a une erreur: – JoePostscript